node-modules - “../../node_modules/.bin/”的简写?
问题描述
在 lerna monorepo 中,我想:
- 没有打字稿作为每个包的开发依赖项。相反,我会将它作为开发依赖项安装在项目根目录中。
- 每个包中都有一个
build
脚本。
现在 - 根据这个问题CLI 包(即那些存在于node_modules/.bin
文件夹中的包)不能像常规包那样用于模块解析。
也就是说,我不能有一个看起来像这样的脚本:
"build": "tsc -v"
因为tsc
二进制文件实际上对它不可用。
为了解决这个问题,我可以做一个相对文件参考,如:
"build" : "../../node_modules/.bin/tsc -v"
这很好用,但有点笨拙。
我希望我可以有一个类似于$(npm bin)
or的命令$(yarn bin)
,但它指的.bin
是项目根目录的文件夹,而不是当前包。
解决方案
我认为这里的基本问题是您需要../../node_modules/.bin/
在$PATH
变量中,但需要动态计算确切的目录。
在 python 领域,您可以在 .python 上执行 .pythonstartup 脚本source ./venv/bin/activate
。然而,Javascript 不需要明确的激活步骤。
如果我们正在处理纯 CLI,那么您可以创建一个 bash 函数来动态进行查找:
function set-project-path() {
BASH_PATH=${BASH_PATH:-$PATH} # only set variable if unset
for DIR in . .. ../.. ../../.. ../../../.. ; do # set to required lookup depth
DIR=$DIR/node_modules/.bin
if [[ -d $DIR ]]; then
PATH=`pwd $DIR`:$BASH_PATH;
echo "set-project-path(): \$PATH += `pwd $DIR`";
break;
fi;
done;
}
function unset-project-path() {
PATH="${BASH_PATH:-$PATH}" # reset to $BASH_PATH if previously set
}
这将需要通过手动运行手动激活:
set-project-path
Usingpwd
为您提供了一个绝对路径,这意味着您可以在项目内的目录之间移动。但是,每次更改到不同的项目时都需要重新运行该脚本。
理论上,这个脚本可以在 中运行.bashrc
,但这假设 bash 是从项目目录树中的某个地方开始的。
如果您想变得非常花哨,可以尝试将此脚本注入到$PS1
在每次呈现命令提示符之前调用的变量中。
另一种方法是简单地符号链接tsc
或node_modules
进入每个包子目录,这是使脚本在您的 . 中可见的另一种方法$PATH
,但不会导致同步或文件空间问题。
推荐阅读
- python - 如何在没有副作用的情况下腌制和解封?
- javascript - 如何在Javascript中将数组值作为对象键传递
- outlook - Microsoft 图形 API - 空的 bccRecipients 列表
- c - 递归 C:堆栈中发生了什么?
- javascript - 样条图 highchart 按顺序填充颜色
- c++ - 两个线程在没有锁的情况下执行 for 循环
- c - 如何使 execv 重新附加到正在运行的进程
- c++ - 在 MacOS 上使用 C++ 获取单键输入
- javascript - 我无法获取集合中的记录总数 - Wix 代码
- javascript - 在 Vanilla js 中复制最接近目标的文本