【问题标题】:Good way to install exact dependency globally全局安装精确依赖的好方法
【发布时间】:2019-09-01 06:56:27
【问题描述】:

对于 Node.js 世界,我们可以使用 NVM 在 Node.js 版本之间切换,还可以切换哪些全局包在范围内(在 $PATH 中)。

但是,如果我想确保在命令行中使用 typescript 版本 3.3.334 怎么办?显然,我可以将那个版本的 typescript 安装到我的本地项目中,但是如果我想避免本地依赖,我如何使用 shell 程序在命令行中使用精确版本的 typescript?

我在想这样的事情:

package="typescript@3.3.334"
dir="$HOME/.temp/$package";

if [ ! -d "$dir" ]; then
    mkdir -p "$dir"
    (cd "$dir" && npm i "$package")
fi

export PATH="$dir/node_modules/.bin:$PATH"

do_the_original_thing_you_wanted_to_do foo bar

【问题讨论】:

    标签: node.js npm command-line-interface npm-cli


    【解决方案1】:

    我可能最终会编写一些 shell 脚本或 bash 函数来轻松切换全局 cli 工具的版本,这很有效:

    #!/usr/bin/env bash
    
    package="typescript"
    version="3.4.1"
    
    dir="$HOME/.npz_temp/$package/$version";
    
    json='{"name":"foo"}'
    
    if [[ ! -f "$dir/success.json" ]]; then
    
        mkdir -p "$dir"
        (
            cd "$dir" &&
            echo "$json" > "$dir/package.json" &&
            npm install "$package@$version" &&
            echo 'npm install success' > "$dir/success.json"
        )
    
    fi
    
    export PATH="$dir/node_modules/.bin:$PATH"
    
    tsc --version
    

    你所要做的就是为包和版本提供一些参数。这种技术也应该适用于已编译/本机代码包,我认为这不会有问题。

    【讨论】:

      【解决方案2】:

      鉴于 npm 与 npx 捆绑在一起,您可能只想运行带有 npx 的 TypeScript 并指定所需的版本号,例如:

      $ npx typescript@3.3.334
      

      这将下载所需版本的typescript 包并运行它(然后将其丢弃)。唯一的缺点是每次运行 npx 时都会一遍又一遍地重新安装包。

      您可以通过在本地安装 typescript 来解决此问题:如果已在本地安装,则正在使用此本地副本,这会加快速度,但一般来说,这是确保每次调用都获得您期望的版本(与通过npm -g typescript@3.3.334 进行的全局安装相反,它可能会被其他人覆盖而您甚至都没有注意到。

      但是,这是您明确提到要避免的。因此,上述方式可能是您的最佳选择。

      【讨论】:

      • 是的,我绝对不想重新安装它。不知道有没有npx的命令可以缓存呢?
      • 是的,npm install typescript 在本地运行?。也许问题是你为什么要避免本地安装,因为这正是为这样的场景而设计的(如果你将它安装为开发依赖项,它甚至不会增加你的生产足迹)?
      • 我想避免库/包的本地依赖,而本地依赖对于应用程序来说是可以的,如果这有意义的话
      • 再说一遍:为什么?这听起来像“我想,因为我想”?
      • 因为磁盘空间和安装速度,仅此而已。假设您的应用程序有 5 个依赖项,并且每个依赖项都安装了一个 typescript 版本。这是迟钝的大声笑,尤其是因为版本不匹配。
      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2021-06-19
      相关资源
      最近更新 更多