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

我正在开发我的npm软件包,我只想在用户手动安装我的软件包(如npm install my-package --save-dev或npm npm命令)时运行特定的脚本。

我不想在通过软件包依赖项安装软件包时运行该命令。 例如,我的软件包是其他软件包other-package依赖项。 即使用户手动安装了other-package ,并且npm应该将my-package安装为依赖项,我也不想运行脚本。

有没有好办法来处理这个问题?

npm有一套脚本,当npm以特定的方式启动时会自动运行 。 您可能感兴趣的脚本是:

  • prepublish :在包发布之前运行。 (也可以在没有任何参数的情况下在本地npm installnpm install 。)
  • publishpublish后:在包发布后运行。
  • preinstall :在安装软件包之前运行
  • installpostinstall :在安装软件包postinstall运行。

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

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

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任务将不会失败,但至less是一个开始。 您可以通过在install-manual-tasks脚本中执行所有检查来解决此问题,然后您不需要使用shell技巧来运行多个脚本。

你可以看一下https://superuser.com/a/105389/627275来看看如何创build一个充当命令别名的shell函数。 这样, npm install就会成为你想要在现实中运行的别名。 它也可以是bash something.sh & npm install的别名。

希望这能回答你的问题!