我开发了一个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"
答案 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
文件。package.json
:"postinstall": "if [ ! -e .no-postinstall ]; then babel src -d src; fi"
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
目录下时运行。