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

jcr*_*oll 3 javascript npm

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

  "dependencies": {
    "ngx-infinite-scroll": "github:jcroll/ngx-infinite-scroll#bugfixes",
  },
Run Code Online (Sandbox Code Playgroud)

在上面,我在 github 上分叉了存储库并创建了一个名为 的新分支bugfixes

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

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

  "scripts": {
    ...
    "prepare": "npm run build"
  },
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tar*_*ani 5

您可以做两件事

包裹的变更

您有一个事件preparepostinstall或者install在同一事件中使用以下内容

"postinstall": "cd node_modules/ngx-infinite-scroll && npm i && npm run build"
Run Code Online (Sandbox Code Playgroud)

然后如果你真的想使用 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",
Run Code Online (Sandbox Code Playgroud)

内置 fork

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

编辑:2018 年 3 月 20 日

你是对的,如果我们使用postinstall那么它将创建无限循环。您可以在prepack活动中这样做。

"prepack": "node build.js",
Run Code Online (Sandbox Code Playgroud)

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

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

使用测试它

npm add tarunlalwani/ngx-infinite-scroll#so49242809
Run Code Online (Sandbox Code Playgroud)

安装后它将有 dist 文件夹