有没有办法在 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】:
你可以做两件事
对您的软件包的更改
您有一个事件prepare
、postinstall
或install
并在相同的情况下使用以下内容
"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_modules
在prepack
被执行时已经存在【参考方案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