Npm:仅在作为依赖项安装时运行后安装脚本

时间:2019-01-16 07:22:56

标签: npm babel npm-scripts

我开发了一个npm软件包(“ node_commons”),该软件包包含在我的其他项目中,如下所示:

package.json(其他项目)

"node-commons": "git+ssh://git@stash.custom.domain.net:7999/npm/libs/node_commons.git"

node_commons软件包是用ES6编写的,但以后不支持该版本,因此我使用后安装脚本将其与babel进行编译。

package.json(node_commons)

"postinstall": "babel src -d src"

这很好。当该软件包作为依赖项包含在我的项目中时,将对文件进行编译。

我的问题:开发node_commons软件包时,我使用npm install安装内部依赖项。但是后来我不想移植它。 我只想在软件包作为依赖项安装时进行翻译(例如在我的其他项目中)。有办法吗?

类似这样的东西:

package.json(node_commons)

"postinstall-as-dependency": "babel src -d src"

3 个答案:

答案 0 :(得分:0)

如果我理解正确,您是否希望软件包仅在用户将其安装为依赖项(postinstall)时运行npm install node-common脚本?

运行后安装脚本时,它具有npm_config_save_dev可用,当用户使用--save-dev标志安装软件包时,它为'true':

"postinstall": "! [ $npm_config_save_dev ] && echo \"Installed as a dependency\" || \"Installed as a dev dependency\""

答案 1 :(得分:0)

  • 在模块根目录中创建.no-postinstall文件。
  • Mac和Linux:将以下内容添加到package.json"postinstall": "if [ ! -e .no-postinstall ]; then babel src -d src; fi"
  • Windows :向package.json添加以下内容:"postinstall": if exist .no-postinstall () else (babel src -d src)"
  • 跨平台(更多工作): 您可以创建节点脚本(即./my-script.js)并使用fs模块,检查.no-postinstall的存在,并使用babel src -d src执行child_process.exec(),如{{3 }}。将脚本添加到package.json"postinstall": node my-script.js

请注意,我使用的是Mac,因此无法验证Windows版本。

说明

if [ ! -e .no-postinstall ]检查给定文件的不存在(使用否定运算符!)。如果文件不存在,它将执行您的脚本。由于您将.no-postinstall文件添加到模块根目录,因此在安装内部模块时不会执行脚本。另一方面,将模块安装为依赖项的模块的根目录中没有.no-postinstall文件,因此脚本会被执行。

.no-postinstall不是一个特殊名称,您可以使用选择的任何名称。

答案 2 :(得分:0)

我遇到了同样的问题,我有一个安装后脚本,我只想在将软件包作为依赖项安装时运行该脚本。

在安装后脚本的顶部,我添加了:

if (!process.cwd().includes('node_modules')) {
 return;
}

然后它只在模块存在于 node_modules 目录下时运行。