我开发了一个npm包("node_commons"),它包含在我的另一个项目中,如下所示:
package.json(其他项目)
"node-commons": "git+ssh://git@stash.custom.domain.net:7999/npm/libs/node_commons.git"
node_commons包是在ES6中编写的,但是以后不支持这个版本,因此我使用postinstall脚本用babel来传输它。
软件包. json(节点公用)
"postinstall": "babel src -d src"
当包作为依赖项包含在我的项目中时,文件就被转移了。
我的问题:当我开发node_commons包时,我使用npm install
来安装内部依赖项。但是我不想移植它。我只想移植,当包作为依赖项安装时(例如在我的另一个项目中)。有办法做到这一点吗?
大概是这样的:
软件包. json(节点公用)
"postinstall-as-dependency": "babel src -d src"
6条答案
按热度按时间bfhwhh0e1#
.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
是否存在,并使用child_process.exec()
执行babel src -d src
,如此处的正式文档所述。将您的脚本添加到package.json
:"postinstall": node my-script.js
个请注意,我使用Mac,所以我无法验证Windows版本。
说明
if [ ! -e .no-postinstall ]
检查不存在(带有否定运算符!
)。如果文件不存在,它将执行您的脚本。由于您将.no-postinstall
文件添加到模块根目录,因此在安装内部模块时不会执行脚本。另一方面,将模块作为依赖项安装的模块在其根目录中没有.no-postinstall
文件,并且您的脚本将被执行。.no-postinstall
不是一个特殊的名称,您可以使用您选择的任何名称。vxbzzdmp2#
在我的例子中,我有一个postinstall脚本,我只想在软件包没有作为依赖项安装时运行它。
下面是我使用的
package.json
脚本:当然,如果您希望脚本仅在作为依赖项安装时运行,则可以反转
if (!myLibAsDep)
。s4chpxco3#
如果我没理解错的话,您希望您的软件包仅在用户将其作为依赖项(
npm install node-common
)安装时才运行postinstall
脚本?当postinstall脚本运行时,它会使用
npm_config_save_dev
,当用户安装带有--save-dev
标志的软件包时,npm_config_save_dev
为“true”:rxztt3cl4#
我遇到了同样的问题,我有一个安装后脚本,我想只在软件包作为依赖项安装时运行它。
在安装后脚本的顶部,我添加了以下内容:
然后它只在模块存在于
node_modules
目录下时运行。v09wglhw5#
这样就可以了:
适用于npm和pnpm。不了解Yarn
https://docs.npmjs.com/cli/v8/using-npm/scripts#best-practices
ufj5ltwl6#
我创建了一个软件包来解决这个问题,灵感来自@venryx的答案。
https://github.com/douglasjunior/ignore-dependency-scripts
用法
替换为:
有了这个:
将
your && scripts && here
替换为所需的任何安装后/安装前脚本,如husky install
、npx pod-install
或两者。现在,当您在
./my-library
中运行yarn install
或npm install
时,your && scripts && here
将正常运行。但是,当您将
my-library
作为依赖项(也称为yarn add url/to/my-library.git
)安装在另一个存储库中时,your && scripts && here
将被忽略。