全局安装确切依赖项的好方法

时间:2019-04-10 18:15:22

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

对于Node.js来说,我们可以使用NVM在Node.js版本之间切换,也可以切换范围内的全局包(在$ PATH中)。

但是,如果我想确保在命令行上使用打字稿版本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

2 个答案:

答案 0 :(得分:1)

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

$ npx typescript@3.3.334

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

您可以通过在本地安装typescript来解决此问题:如果已经在本地安装了此副本,则可以使用此本地副本,这样可以加快处理速度,但是一般来说,这是确保每次调用的最简单方法您将获得所需的版本(与通过npm -g typescript@3.3.334进行的全局安装相反,该安装可能会被其他人覆盖,甚至没有注意到。

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

答案 1 :(得分:0)

我可能最终会写一些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

要使其通用化,您要做的就是为软件包和版本提供一些参数。该技术也应与已编译/本机代码包一起使用,我不认为这有问题。