只有当用户手动安装我的 npm 包时,才有 运行 脚本的好方法吗?(不是通过依赖安装)

Is there good way to run a script only when the user install my npm package manually?(not installed by dependency)

我正在开发我的 npm 包,我想 运行 只有当用户像 npm install my-package --save-dev 或 npm 命令之类的手动安装我的包时才使用特定脚本。

我不想 运行 通过包依赖安装包时的命令。 例如,我的包是另一个包 other-package 的依赖项。 即使用户手动安装 other-package 并且 npm 应该安装 my-package 作为依赖项,我也不想 运行 脚本。

请问有什么好的方法可以解决吗?

您可以查看 https://superuser.com/a/105389/627275 以了解如何创建一个 shell 函数作为命令的别名。这样一来,npm install 就可以作为您在现实中想要 运行 的任何东西的别名。它也可以是 bash something.sh & npm install 的别名。

希望这能回答您的问题!

npm 以特定方式启动时,

npm 有一组 scripts that will automatically run。您可能感兴趣的脚本是:

  • prepublish: Run BEFORE the package is published. (Also run on local npm install without any arguments.)
  • publish, postpublish: Run AFTER the package is published.
  • preinstall: Run BEFORE the package is installed
  • install, postinstall: Run AFTER the package is installed.

没有完全符合您的标准的事件,但您可以使用 install 事件之一,然后使用一个中间脚本在实际脚本之前检测 npm 命令行选项。

由于 prepublish 的(imo 可怕)工作方式,许多人已经编写了模块来完成类似的任务,并且这些模块可以很容易地适应您的要求。

iarna/inpublish 就是一个很好的例子。它检查 process.env['npm_config_argv'] 是否存在 /^i(n(s(t(a(ll?)?)?)?)?)?$/

使用以下 package.json 设置:

"scripts": {
  "postinstall": "my-install && install-manual-tasks || not-my-install"
}

如果 my-install 使用 process.exit(0),则 install-manual-tasks 将 运行。如果您 process.exit(1)not-my-install 将进行清理,这样 npm 任务就不会失败。

我认为这个设置确实有问题。如果您的 install-manual-tasks 失败,退出状态将被静音并且 npm 任务不会失败,但至少是一个开始。您可以通过在 install-manual-tasks 脚本中进行所有检查来解决此问题,然后您不需要使用 shell 技巧来 运行 多个脚本。