有没有办法在 package.json 中分叉一个 npm 库并在安装时运行它的构建过程?

Posted

技术标签:

【中文标题】有没有办法在 package.json 中分叉一个 npm 库并在安装时运行它的构建过程?【英文标题】:Is there a way to fork a npm library in package.json and run its build process on install? 【发布时间】:2018-08-20 22:05:34 【问题描述】:

我有一个 npm 依赖项(例如ngx-infinite-scroll),我目前正在尝试分叉(用于修复错误)并将我的分叉版本作为依赖项包含在我的应用程序中。下面是我的package.json 中包含的示例:

  "dependencies": 
    "ngx-infinite-scroll": "github:jcroll/ngx-infinite-scroll#bugfixes",
  ,

在上面,我在 github 上 fork 了 repo,并创建了一个名为 bugfixes 的新分支。

我的问题是维护者运行了一个构建过程,该过程在./dist 目录中创建了一个工件,然后使用$ npm run publish ./dist 将此平面目录发布到 npm。但是,当我通过 $ npm i ngx-infinite-scroll 安装新的分叉存储库时,会下载整个存储库,不是dist 目录。

现在我知道这应该是意料之中的。我希望做的一件事是至少在安装时通过添加库的package.json 的脚本来创建dist 目录:

  "scripts": 
    ...
    "prepare": "npm run build"
  ,

但是我在安装时仍然看不到dist 目录。即使这样,我仍然需要更改 package.json 以将 module 键指向这个新的嵌套目录入口点。

我想要 而不是 是当我从 github 安装这个库时,让它将其扁平化的 dist 目录发布为库的***目录,就像原始库的安装方式一样维护者构建库并运行$ npm rub publish ./dist。有没有办法做到这一点?

编辑:我还通过this answer 知道我可以构建 dist 并将代码提交到这个新分支,但我想要一种更优雅的方式,因此提出了这个问题。

【问题讨论】:

你的命令不应该是"prepare": "cd node_modules/ngx-infinite-scroll && npm i && npm run build"吗? 【参考方案1】:

你可以做两件事

对您的软件包的更改

您有一个事件preparepostinstallinstall 并在相同的情况下使用以下内容

"postinstall": "cd node_modules/ngx-infinite-scroll && npm i && npm run build"

如果你真的想使用dist,你可以像下面这样做

"postinstall": "cd node_modules/ngx-infinite-scroll && npm i && npm run build && mv dist ../ngx-infinite-scroll-dist && cd .. && rm -rf ngx-infinite-scroll && mv ngx-infinite-scroll-dist ngx-infinite-scroll && cd ngx-infinite-scroll && npm i",

在 fork 中构建

另一种选择是更改 fork 并更新 package.json 的 postinstall 以执行 npm run build 并在安装分叉包时创建 dist 文件夹

编辑:2018 年 3 月 20 日

你是对的,如果我们使用postinstall 那么它将创建无限循环。您可以在 prepack 事件中执行此操作。

"prepack": "node build.js",

下面是一个可以实际测试的示例 github 项目

https://github.com/tarunlalwani/ngx-infinite-scroll/tree/so49242809

使用测试它

npm add tarunlalwani/ngx-infinite-scroll#so49242809

安装后会有 dist 文件夹

【讨论】:

嗨塔伦,谢谢你的回答。不幸的是,我不确定postinstall 脚本是否有效。首先(顺便说一句),似乎不需要cd node_modules/ngx-infinite-scroll。然而,更重要的是,它似乎创建了一个递归循环:安装包的依赖项,并且因为 npm i 已运行,它开始再次安装包,并且再次无限 关于 cd node_modules/ngx-infinite-scroll 不需要我现在看到您正在谈论更改父包的安装后脚本。我试图改变可安装包的安装后脚本(这最初是我在这里所追求的)。我看到您在“Build in fork”部分下尝试了此操作,但我不确定您的设计方式是否有效。 另外 Tarun 我现在尝试更改父包的 postinstall 但子包的构建脚本在安装过程中中断,因为(我相信)脚本中定义的路径不再有效由于嵌套的目录结构。 这似乎对塔伦有效。我的最终脚本(虽然丑陋)实际上确实按照要求构建和展平了依赖项:"prepack": "npm i && npm run build && find * -type f -not -name 'dist' -not -name 'package.json' -not -path '*dist/*' -exec rm -rv + && rm -rf src example node_modules scripts tests dist/package.json && ls -l && mv -v dist/* ." 找到那个钩子 Tarun 的工作很好。 你可能不需要npm i,因为我可以看到node_modulesprepack被执行时已经存在【参考方案2】:

有这个更简单的方法:patch-package

patch-package 让应用程序作者可以立即对 npm 进行修复 依赖项。对于我们这些生活在 最前沿。

patch-package 创建的补丁是自动优雅的 当你使用 npm(>=5) 或 yarn 时应用。

不再等待合并和发布拉取请求。 不再分叉回购只是为了解决一个小问题,阻止你 应用无法运行。

【讨论】:

以上是关于有没有办法在 package.json 中分叉一个 npm 库并在安装时运行它的构建过程?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为 package.json 中的相同依赖项指定不同的路径?

npm install:有没有办法忽略 package.json 中的特定依赖项

从 package-lock.json 创建 package.json

有没有办法在不安装包的情况下按字母顺序排列 package.json?

在 nx 构建/部署上生成 package.json

使用 shell 脚本提取 package.json 版本