繁体   English   中英

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

[英]Is there a way to fork a npm library in package.json and run its build process on install?

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

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

在上面,我在 github 上分叉了 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安装原始库一样$ npm rub publish ./dist 有没有办法做到这一点?

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

你可以做两件事

对您的包裹的更改

您有一个事件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 并更新 package.json 的postinstall以在postinstall fork 包时执行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 文件夹

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

patch-package 让应用程序作者可以立即修复 npm 依赖项。 对于我们这些生活在最前沿的人来说,这是一个至关重要的创可贴。

当您使用 npm(>=5) 或 yarn 时,由 patch-package 创建的补丁会自动且优雅地应用。

不再等待合并和发布拉取请求。 不再为了修复阻止您的应用程序工作的一件小事而分叉存储库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM