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

nxagd54h  于 2022-11-24  发布在  其他
关注(0)|答案(6)|浏览(471)

我开发了一个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"
bfhwhh0e

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不是一个特殊的名称,您可以使用您选择的任何名称。

vxbzzdmp

vxbzzdmp2#

在我的例子中,我有一个postinstall脚本,我只想在软件包没有作为依赖项安装时运行它。
下面是我使用的package.json脚本:

{
    [...]
    "scripts": {
        "@comment_postinstall": "Behavior of the node-js subscript below: if '.git' doesn't exist under my-lib, it's installed as a dep, so do nothing -- else, return error-code 1, causing patch-package to run.",
        "postinstall": "node -e \"let myLibAsDep = !require('fs').existsSync('.git'); if (!myLibAsDep) process.exit(1);\" || patch-package"
    },
    [...]
}

当然,如果您希望脚本仅在作为依赖项安装时运行,则可以反转if (!myLibAsDep)

s4chpxco

s4chpxco3#

如果我没理解错的话,您希望您的软件包仅在用户将其作为依赖项(npm install node-common)安装时才运行postinstall脚本?
当postinstall脚本运行时,它会使用npm_config_save_dev,当用户安装带有--save-dev标志的软件包时,npm_config_save_dev为“true”:

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

rxztt3cl4#

我遇到了同样的问题,我有一个安装后脚本,我想只在软件包作为依赖项安装时运行它。
在安装后脚本的顶部,我添加了以下内容:

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

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

v09wglhw

v09wglhw5#

这样就可以了:

if (process.env.INIT_CWD === process.cwd())
  process.exit()

适用于npm和pnpm。不了解Yarn
https://docs.npmjs.com/cli/v8/using-npm/scripts#best-practices

ufj5ltwl

ufj5ltwl6#

我创建了一个软件包来解决这个问题,灵感来自@venryx的答案。
https://github.com/douglasjunior/ignore-dependency-scripts

用法

替换为:

// package.json

  "name": "my-library",
  "scripts:" { 
    // "start", "test", "build", etc
    "postinstall/preinstall/prepare/etc": "your && scripts && here"
  },

有了这个:

// package.json

  "name": "my-library",
  "scripts:" { 
    // "start", "test", "build", etc
    "postinstall/preinstall/prepare/etc": "npx --yes ignore-dependency-scripts \"your && scripts && here\""
  },

your && scripts && here替换为所需的任何安装后/安装前脚本,如husky installnpx pod-install或两者。
现在,当您在./my-library中运行yarn installnpm install时,your && scripts && here将正常运行。
但是,当您将my-library作为依赖项(也称为yarn add url/to/my-library.git)安装在另一个存储库中时,your && scripts && here将被忽略。

相关问题