“ ../../node_modules/.bin/”的简写?

时间:2020-04-23 05:59:35

标签: node-modules lerna

在lerna monorepo中,我想:

  • 没有打字稿作为每个程序包的开发依赖项。相反,我会将其作为dev依赖项安装在项目根目录中。
  • 每个程序包中都有一个build脚本。

现在-根据this issue CLI软件包(即,位于node_modules/.bin文件夹中的软件包),无法像常规软件包一样用于模块解析。

也就是说,我没有一个像这样的脚本:

"build": "tsc -v"

因为tsc二进制文件实际上不可用。

要解决这个问题,我可以做一个相对文件引用,例如:

"build" : "../../node_modules/.bin/tsc -v"

这很好用,但是有点笨拙。

我希望我可以有一个类似于$(npm bin)$(yarn bin)的命令,但是该命令引用项目根目录的.bin文件夹,而不是当前软件包。

1 个答案:

答案 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变量中,该变量在每次命令提示符渲染之前都会被调用。

另一种方法是简单地将tscnode_modules符号链接到每个包子目录中,这是使脚本在$PATH中可见的另一种方式,但不会引起同步或文件空间问题