只有当用户手动安装我的npm包时才有运行脚本的好方法吗?(不是由dependency安装)
我正在开发我的npm软件包,我只想在用户手动安装我的软件包(如npm install my-package --save-dev
或npm npm命令)时运行特定的脚本。
我不想在通过软件包依赖项安装软件包时运行该命令。 例如,我的软件包是其他软件包other-package
依赖项。 即使用户手动安装了other-package
,并且npm应该将my-package
安装为依赖项,我也不想运行脚本。
有没有好办法来处理这个问题?
npm
有一套脚本,当npm
以特定的方式启动时会自动运行 。 您可能感兴趣的脚本是:
prepublish
:在包发布之前运行。 (也可以在没有任何参数的情况下在本地npm install
上npm install
。)publish
,publish
后:在包发布后运行。preinstall
:在安装软件包之前运行install
,postinstall
:在安装软件包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
的别名。
希望这能回答你的问题!