npm-scripts How npm handles the "scripts" field

DESCRIPTION

对于以下脚本,npm支持package.json文件的" scripts"属性:

另外,可以通过运行npm run-script <stage>来执行任意脚本. 具有匹配名称的prepost命令也将针对它们运行(例如premyscriptmyscriptpostmyscript ). 依赖项中的脚本可以使用npm explore <pkg> -- npm run <stage> .

PREPUBLISH AND PREPARE

DEPRECATION NOTE

[email protected] ,npm CLI为npm publishnpm install都运行了prepublish脚本,因为这是准备要使用的软件包的便捷方法(以下部分介绍了一些常见的使用案例). 在实践中,这也令人非常困惑 . 从[email protected] ,引入了一个新事件prepare ,保留了此现有行为. 已添加事件prepublishOnly作为过渡策略,以允许用户避免现有npm版本的混乱行为,并且仅在npm publishnpm publish (例如,最后一次运行测试以确保其状态良好).

请参阅https://github.com/npm/npm/issues/10074,以获得更长时间的理由,并请继续阅读此更改.

USE CASES

如果需要在使用软件包之前对软件包执行操作,而使用的方式不取决于目标系统的操作系统或体系结构,请使用prepublish脚本. 这包括以下任务:

prepublish时执行这些操作的好处是,它们可以在一个位置中一次性完成,从而降低了复杂性和可变性. 此外,这意味着:

DEFAULT VALUES

npm将基于包内容默认一些脚本值.

USER

如果npm是用root特权调用的,则它将uid更改为用户帐户或user配置指定的uid,默认情况下为nobody . 设置unsafe-perm标志以使用root特权运行脚本.

ENVIRONMENT

程序包脚本在一个环境中运行,在该环境中,可以获得许多有关npm设置和进程当前状态的信息.

path

如果您依赖于定义可执行脚本的模块(例如测试套件),则这些可执行文件将被添加到PATH以执行脚本. 因此,如果您的package.json具有以下内容:

{ "name" : "foo"
, "dependencies" : { "bar" : "0.1.x" }
, "scripts": { "start" : "bar ./test" } }

然后您可以运行npm start来执行bar脚本,该bar脚本在npm install上导出到node_modules/.bin目录中.

package.json vars

package.json字段添加到npm_package_前缀. 因此,举例来说,如果您在package.json文件中有{"name":"foo", "version":"1.2.5"} ,那么您的打包脚本会将npm_package_name环境变量设置为" foo",并将npm_package_version设置为" 1.2.5". 您可以使用process.env.npm_package_nameprocess.env.npm_package_version在代码中访问这些变量,以此类推.

configuration

配置参数以npm_config_前缀放入环境中. 例如,您可以通过检查npm_config_root环境变量来查看有效的root配置.

Special: package.json “config” object

如果存在<name>[@<version>]:<key>的配置参数,则package.json" config"键在环境中将被覆盖. 例如,如果package.json具有以下内容:

{ "name" : "foo"
, "config" : { "port" : "8080" }
, "scripts" : { "start" : "node server.js" } }

而server.js是这样的:

http.createServer(...).listen(process.env.npm_package_config_port)

那么用户可以通过以下方式更改行为:

npm config set foo:port 80

current lifecycle event

最后,将npm_lifecycle_event环境变量设置为正在执行该循环的任何阶段. 因此,您可以将一个脚本用于流程的不同部分,并根据当前情况进行切换.

对象按照这种格式展平,因此,如果您的package.json中有{"scripts":{"install":"foo.js"}} ,那么您会在脚本中看到以下内容:

process.env.npm_package_scripts_install === "foo.js"

EXAMPLES

For example, if your package.json contains this:

{ "scripts" :
  { "install" : "scripts/install.js"
  , "postinstall" : "scripts/install.js"
  , "uninstall" : "scripts/uninstall.js"
  }
}

然后将在生命周期的安装和安装后阶段调用scripts/install.js ,并在卸载软件包时调用scripts/uninstall.js uninstall.js. 由于scripts/install.js运行于两个不同的阶段,因此在这种情况下,查看npm_lifecycle_event环境变量将是明智的.

如果要运行make命令,可以这样做. 这很好用:

{ "scripts" :
  { "preinstall" : "./configure"
  , "install" : "make && make install"
  , "test" : "make test"
  }
}

EXITING

Scripts are run by passing the line as a script argument to sh.

如果脚本以非0的代码退出,则将中止该过程.

请注意,这些脚本文件不必是nodejs甚至是javascript程序. 它们只是必须是某种可执行文件.

HOOK SCRIPTS

如果要在所有包的特定生命周期事件中运行特定脚本,则可以使用挂钩脚本.

将可执行文件放在node_modules/.hooks/{eventname} ,当该软件包在该根目录中安装的所有软件包的生命周期中都经过该点时,它将为所有软件包运行.

挂钩脚本的运行方式与package.json脚本完全相同. 也就是说,它们处于上述env的单独子进程中.

BEST PRACTICES

SEE ALSO


by  ICOPY.SITE