Kew*_*hka 9 npm babeljs npm-scripts
我开发了一个 npm 包(“node_commons”),它包含在我的其他项目中,如下所示:
package.json(其他项目)
"node-commons": "git+ssh://git@stash.custom.domain.net:7999/npm/libs/node_commons.git"
Run Code Online (Sandbox Code Playgroud)
node_commons 包是用 ES6 编写的,但以后不支持此版本,因此我使用 postinstall 脚本将其与 babel 转译。
package.json (node_commons)
"postinstall": "babel src -d src"
Run Code Online (Sandbox Code Playgroud)
这工作正常。当包作为依赖项包含在我的项目中时,文件将被转换。
我的问题:当我开发 node_commons 包时,我npm install用来安装内部依赖项。但后来我不想转译它。当包作为依赖项安装时(例如在我的其他项目中),我只想转译。有没有办法做到这一点?
像这样的东西:
package.json (node_commons)
"postinstall-as-dependency": "babel src -d src"
Run Code Online (Sandbox Code Playgroud)
.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()如官方文档中所述。将您的脚本添加到package.json:"postinstall": node my-script.js请注意,我使用的是 Mac,因此无法验证 Windows 版本。
if [ ! -e .no-postinstall ]!检查给定文件是否不存在(使用否定运算符)。如果文件不存在,它将执行您的脚本。由于您将.no-postinstall文件添加到模块根目录,因此在安装内部模块时不会执行脚本。另一方面,将模块安装为依赖项的模块.no-postinstall在其根目录中没有文件,并且您的脚本会被执行。
.no-postinstall不是一个特殊的名称,您可以使用您选择的任何名称。
如果我理解正确,您希望您的包postinstall仅在用户将其安装为依赖项(npm install node-common)时才运行脚本?
当您的安装后脚本运行时,它具有npm_config_save_dev可用的权限,当用户使用以下标志安装包时,这是“true” --save-dev:
"postinstall": "! [ $npm_config_save_dev ] && echo \"Installed as a dependency\" || \"Installed as a dev dependency\""
Run Code Online (Sandbox Code Playgroud)