【问题标题】:Short hand for "../../node_modules/.bin/"?“../../node_modules/.bin/”的简写?
【发布时间】:2020-04-23 05:59:35
【问题描述】:

在 lerna monorepo 中,我想:

  • 没有 typescript 作为每个包的开发依赖项。相反,我会将它作为开发依赖项安装在项目根目录中。
  • 在每个包中都有一个build 脚本。

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

也就是说,我不能有这样的脚本:

"build": "tsc -v"

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

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

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

这很好用,但有点笨拙。

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

【问题讨论】:

    标签: node-modules lerna


    【解决方案1】:

    我认为这里的基本问题是您的 $PATH 变量中需要 ../../node_modules/.bin/,但需要动态计算确切的目录。

    在 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 中可见的另一种方法,但不会导致同步或文件空间问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 2016-09-05
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多