在lerna monorepo中,我想:
build
脚本。 现在-根据this issue CLI软件包(即,位于node_modules/.bin
文件夹中的软件包),无法像常规软件包一样用于模块解析。
也就是说,我没有一个像这样的脚本:
"build": "tsc -v"
因为tsc
二进制文件实际上不可用。
要解决这个问题,我可以做一个相对文件引用,例如:
"build" : "../../node_modules/.bin/tsc -v"
这很好用,但是有点笨拙。
我希望我可以有一个类似于$(npm bin)
或$(yarn bin)
的命令,但是该命令引用项目根目录的.bin
文件夹,而不是当前软件包。
答案 0 :(得分:2)
我认为这里的基本问题是,您需要在../../node_modules/.bin/
变量中使用$PATH
,但是需要动态计算确切的目录。
在python领域中,您可以在source ./venv/bin/activate
上执行.pythonstartup脚本。但是,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
使用pwd
为您提供了绝对路径,这意味着您可以在项目内部的目录之间移动。但是,每次更改为其他项目时,都需要重新运行该脚本。
从理论上讲,该脚本可以在.bashrc
中运行,但这是假设bash从项目目录树中的某个位置开始。
如果您真的想花哨的话,可以尝试将此脚本注入到$PS1
变量中,该变量在每次命令提示符渲染之前都会被调用。
另一种方法是简单地将tsc
或node_modules
符号链接到每个包子目录中,这是使脚本在$PATH
中可见的另一种方式,但不会引起同步或文件空间问题