install之前执行prepubish
脚本,因为这做法便于准备package环境(几种用法如本段下面描述)。但事实证明这让人非常困惑。所以在npm@4.0.0后,新增来一种事件prepare
来替代上述功能。另外一种新事件prepublishOnly
作为替代策略,让用户避免以往npm版本的混乱行为。prepublishOnly
只在npm publish
前执行(例如,publish前最后执行一次测试,以确保无误)
,这里对此变更有过漫长的争论可作参考。
如果你需要在使用package之前执行某些操作,而不依赖于目标系统的操作系统或目录结构,请使用prepublish脚本。例如以下任务:
-
获取你的package所需的远程资源
在publish时做这些事情的好处是,它们可以在同一处完成,从而降低复杂性和差异性。另外,这意味着:
-
你不需要在包中包含min版本,以节省空间
-
你的用户的电脑上不必具有curl或wget或其他系统工具
如果使用root权限调用npm,那么它会将uid更改为用户配置指定的uid,默认为nobody。设置unsafe-perm以使用root权限运行脚本。
如果你依赖的模块(如测试模块)定义了可执行脚本,那么这些可执行文件将被添加到PATH中执行。所以,如果你的package.json有这样的依赖:
使用npm_config_
前缀将配置参数放在环境中。例如你可以通过检查npm_config_root
环境变量来查看目前生效的root配置。
那么用户可以这样覆写port变量:
最后,npm_lifecycle_event
环境变量代表当前执行循环的哪个阶段。所以,你可以使用单个脚本用于根据当前正在发生的事件切换的进程的不同部分。
对象按照层级以下划线连接,如果您的package.json中有
如果你想要运行make命令也没问题,这样写:
npm脚本是通过将该行作为脚本参数传给sh来运行的。
如果脚本不是以退出码0退出,则会中止该进程。
请注意,这些脚本文件不必是nodejs甚至是javascript程序。他们只需要一些可执行文件。
如果要为所有package在某生命周期事件中运行某脚本,则可以使用钩子脚本。
Hook脚本的运行方式与package.json里的脚本完全相同。也就是说,它们与上述env在一个单独的子进程中。
-
不要以0以外的错误码退出,除非你真的想这样做。因为这将导致npm操作失败(
install
脚本除外),并可能会回滚。如果这个错误无关紧要或只会阻断一些小功能,那么最好只是输出一个警告,让线程成功退出。 -
尽量不要使用npm脚本来做npm本身就可以做的事情。通读package.json文件,你可以学到所有通过简单、合适的配置来具体描述你的package。这通常更健壮和通用。
-
通过检查
env
来决定把东西装在哪。例如,如果npm_config_binroot
环境变量设置为/home/user/bin
,那么不要尝试将可执行文件安装到/usr/local/bin
中。用户可能因为某种原因设置了这种方式。 -
不要在脚本命令里加
sudo
前缀。如果由于某些原因需要root权限,否则会报错;那么用户应该考虑以sudo运行npm命令。 -
不要使用
install
脚本。使用.gyp
文件进行编译,其他情况则使用prepublish
。你最好永远不要自定义preinstall
或install
脚本。如果你要这样做,请优先考虑是否有其他办法。install
或preinstall
脚本的唯一正确使用场景是用作设置那些编译的目标目录。