首页 > 解决方案 > “../../node_modules/.bin/”的简写?

问题描述

在 lerna monorepo 中,我想:

现在 - 根据这个问题CLI 包(即那些存在于node_modules/.bin文件夹中的包)不能像常规包那样用于模块解析。

也就是说,我不能有一个看起来像这样的脚本:

"build": "tsc -v"

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

为了解决这个问题,我可以做一个相对文件参考,如:

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

这很好用,但有点笨拙。

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

标签: node-moduleslerna

解决方案


我认为这里的基本问题是您需要../../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在每次呈现命令提示符之前调用的变量中。

另一种方法是简单地符号链接tscnode_modules进入每个包子目录,这是使脚本在您的 . 中可见的另一种方法$PATH,但不会导致同步或文件空间问题。


推荐阅读