gpt4 book ai didi

node.js - 使用 .bash_profile 和 "postinstall"脚本避免 NPM 全局安装

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:07 25 4
gpt4 key购买 nike

NPM 理念,无论好坏,都是在 ./node_modules 中本地安装项目所需的所有必要依赖项,并让 package.json 反射(reflect)所有必要的依赖项。

我有一个库,通常会受益于全局安装和本地安装,类似于 Gulp、Mocha 等。

上述最隐蔽的问题之一是全局和本地版本可能不同,从而导致给定项目的兼容性问题。

我想到我们可以通过在 .bash_profile 中创建别名来避免这个问题,如下所示:

# bash psuedocode 
* alias gulp='using current working directory, find the locally installed gulp and run that'

我的库不是 Gulp,但你明白了。我知道很多开发人员不喜欢第三方写入他们的 bash_profiles 的想法,但我认为这有点保留,考虑到这样做的外部影响为零(TMK)。

所以我有三个问题:

(1) Is this a good idea?

(2) Are there any projects that do something similar and how?

(3) I an not great with bash scripting, how do you write a bash script that can recursively look for node_modules/.bin/gulp if you the dev runs the gulp command from a directory that is within the project but not in the root?

我的想法是作为安装后脚本

npm install --save-dev gulp

我们将运行一个脚本

  1. 将以上行*添加到 .bash_profile
  2. 在该行中,我们将指向存储在/Users/you/.gulp 下的脚本,该脚本将负责查找本地安装的 gulp。

这样,当模块仅用于命令行方便时,我们就无需全局安装模块,并减轻了不同软件包版本的问题。

最佳答案

我将一一解答您的 3 个问题:

(1) Is this a good idea?

不。自动更改用户的私有(private)文件永远不是一个好主意,而且我发现如果您这样做,可能会出现一些严重错误 - 从用户必须在程序后进行清理的纯粹烦恼,到破坏用户的系统配置,再到严重的安全问题。

(2) Are there any projects that do something similar and how?

我希望不会。我永远不会运行任何与我的 .bash_profile 相混淆的程序- 尽管我没有。我有.profile.bashrc 。这对您来说是另一个问题 - 您确定您知道要编辑什么吗?如果我使用 dash 会怎样?我有时会使用它,或者 zsh或者其他一些外壳?

(3) I an not great with bash scripting, how do you write a bash script that can recursively look for node_modules/.bin/gulp if you the dev runs the gulp command from a directory that is within the project but not in the root?

如果您不擅长 bash 脚本,那么您绝对不应该自动编辑用户的私有(private)文件。

可以做的是在单独的文件中提供特定的别名或 bash 函数以方便用户,并解释用户如何在其 .bashrc 内获取您的文件。 如果他们愿意

但永远不要为他们做出这个决定。如果出现任何问题,这甚至可能会给您带来法律后果。

函数示例

为了回答您在评论中提出的问题,我将添加一些有关 Bash 中函数如何工作的内容。

my collection of script on GitHub我有一些关于 how to install them 的说明功能和 how to use them 。他们的源代码可用 here .

该集合中的示例函数是 ok - 这是它的源代码:

ok() {
# prints OK or ERROR and exit status of previous command
s=$?
if [[ $s = 0 ]]; then
echo OK
else
echo ERROR: $s
fi
}

您可以从以下位置下载它(以及一些其他相关功能):

如果将其另存为~/ok-functions然后你可以运行:

source ~/ok-functions

让它们在该 session 中可用,或者您可以将该行放在 .profile 中或.bashrc每次登录后都可用。您可以像使用普通命令或程序一样使用它,如下所示:

ls /bin; ok
ls /binn; ok

阻止全局安装的工作示例

我编写了一个 Bash 函数,它可以执行您想要执行的操作 - 它停止某个模块的全局安装 - 称为 modname在这个例子中。将其保存到某个文件 - 例如至~/no-global-restricted-module - 当然你可以更改restricted-module姓名 n以及 w 中的警告消息以满足您的需求:

npm() {
n=restricted-module
w="Please don't install $n globally - see: http://example.com/"
i=0
g=0
m=0
for a in "$@"; do
case $a in
i|install)
i=1;;
-g|--global)
g=1;;
$n)
m=1;;
esac
done
if (( $i == 1 && $g == 1 && $m == 1 )); then
echo $w >&2
return 1
else
`which npm` "$@"
fi
}

然后将此行添加到您的 ~/.profile 中或~/.bashrc :

source ~/no-global-restricted-module

现在,当您再次登录或打开新的终端窗口时,您可以尝试在命令行中运行以下命令:

npm install --global restricted-module

您应该会看到一条警告,并且不会开始安装。如果您输入其他模块名称或省略 --global切换然后安装应该照常进行。这也适用于 i 的快捷方式而不是install-g而不是--global .

这几乎就是您正在尝试做的事情。您可以将该函数包含在您的文档中,并附上有关如何使用它的说明。我特此根据 MIT 许可证条款发布它,以便您可以自由使用它。我在 GitHub 上发布了它,其中包含更多配置选项以及如何使用它的信息,请参阅:

另请参阅

另请参阅this answer以在终端中播放各种声音为例,更好地解释如何编写、安装和使用 Bash 函数。

关于node.js - 使用 .bash_profile 和 "postinstall"脚本避免 NPM 全局安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40067055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com