npm安装和构建forked github repo

hug*_*jmh 110 github npm git-fork npm-publish npm-install

这不是一个全新的问题,但我现在一直在寻找一段时间,我很难找到解决方案.

我正在为我的角应用程序使用一个名为angular-translate的模块.但是,我必须对源代码进行一些小的修改才能使所有内容按照我喜欢的方式运行,现在我想继续保留这些更改npm install.一位同事建议我分叉源代码的回购并指向我的分叉回购作为依赖,我已经尝试过这些方式,例如

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz
Run Code Online (Sandbox Code Playgroud)

第一个给我一个这样的目录,没有构建.只是一个package.json,.npmignore和一些markdown文件

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc
Run Code Online (Sandbox Code Playgroud)

第二个npm install给了我完整的回购,但我再也没有得到像我使用命令时的构建npm install angular-translate.我已经看到了运行预发布脚本的一些讨论,但我不确定在安装所有模块时如何执行此操作.我也尝试将fork作为我自己的模块发布到npm注册表,但我再次没有构建,我不确定这是正确的做法...

对于我对这个话题的无知,我道歉.我对npm没有太多的经验.很想得到关于这个问题的一些反馈.当需要对包的源代码进行修改时,它似乎是一个常见的问题?也许有更好的解决方案?在此先感谢您的帮助.

Rya*_*Zim 120

试试npm install <ghusername>/<repoName>,<ghUsername>你的GitHub用户名在哪里(没有@),<repoName>是存储库的名称.这应该正确安装它.您很可能希望在安装命令中使用--save--save-dev标记来保存依赖项package.json.

如果这不能正常工作,请检查.npmignore文件的内容.

如果安装命令需要很长时间,请不要惊慌; 从git存储库安装比从npm注册表安装要慢.


编辑:

你的问题是,在你的情况下,dist/没有承诺回购(因为它在.gitignore).这就是实际代码的存在.dist/src/在将包发布到npm注册表之前从文件构建的,但dist/永远不会提交到repo.

这是丑陋的,但在这种情况下,你必须删除dist/.gitignore,然后运行:

npm run build
git add .
git commit
git push
Run Code Online (Sandbox Code Playgroud)

(确保你先跑npm install)

然后你应该能够从github安装.

使用postinstall脚本可能有另一种方法可以做到这一点,但我不确定这是否可行; 我从来没有尝试过.

  • @KaMok我认为另一种选择是,在您的fork的package.json文件中,在scripts下,将prepublish重命名为prepare。看来,当执行`npm install`或`npm install github:user_name / fork_name --save`(和yarn相同)时,它也会运行`prepare`脚本中的内容。假设此软件包的`prepublish`脚本创建了构建文件,通常是这种情况。 (5认同)
  • 如果你需要一个特定的分支,`npm install <ghusername>/<repoName>#branchName` (3认同)
  • 是的,那几乎就是解决方案。还必须做一个npm安装并修改GruntFile,但这使它起作用。谢谢你的帮助 :) (2认同)
  • 除了忽略dist之外,真的没有其他方法可做吗?我想对原始回购进行公关,但与发行人联系,他会不会喜欢? (2认同)
  • @RyanZim你错了。只要设置正确,从 git 安装就可以很好地工作。https://docs.npmjs.com/cli/install “如果正在安装的包包含`prepare`脚本,则在安装包之前,将安装其`dependencies`和`devDependencies`,并运行prepare脚本打包并安装。” (2认同)

Cam*_*ind 23

TL;DR 使用prepare脚本

并且不要忘记 package.json#files .npmignore

发布到 npmjs.com 的代码通常不是包存储库中的内容。将 JavaScript 源文件“编译”成供库中一般使用的版本是很常见的。这就是通常发布到 npmjs.com 的内容。

发布之前npm自动运行“构建”步骤是一种很常见的功能( )。这最初称为. 似乎 Npm 认为在上运行脚本会很方便,因为这是初始化开发环境的标准方法。npm publishprepublishprepublishnpm install

这最终导致了社区中的一些重大混乱。Github 上有很多关于这个的问题。

最后,为了不改变旧的行为,他们决定再添加两个自动脚本:prepublishOnlyprepare.

prepublishOnly做你期望的。它不会在 上运行npm install。许多包维护者只是盲目地转向了这个。

但是也有这个问题,人们不想依赖 npmjs.com 来分发包的版本。Git 存储库是自然的选择。但是,通常的做法是不将“编译”文件提交到 git。这prepare就是添加处理...


prepare 是正确的方法

如果您有一个包含源文件的存储库,但需要“构建”步骤才能使用它,
prepare那么在所有情况下都完全符合您的要求(从 npm 4 开始)。

prepare:在包被打包和发布之前,在npm install没有任何参数的本地运行,以及在安装 git 依赖项时运行。

您甚至可以将构建依赖项放入其中devDependencies,它们将在prepare执行之前安装。

这是我使用此方法的包的示例


问题 .gitignore

这个选项有一个问题会吸引很多人。当准备依赖性,NPM和纱将保持只有那些在列出的文件files的部分package.json

人们可能会看到files默认包含所有文件并认为它们已完成。什么是容易错过的是.npmignore 大多覆盖files指令,如果.npmignore不存在,.gitignore来代替。

因此,如果您.gitignore像一个理智的人一样将构建的文件列在 中,并且不做任何其他事情,prepare看起来会损坏

如果您修复files为仅包含构建的文件或添加一个空的.npmignore,则一切就绪。

我的推荐

设置files(或通过倒置.npmignore),以便实际发布的唯一文件是已发布包的用户所需的文件。恕我直言,无需在已发布的包中包含未编译的源代码。


原答案:https : //stackoverflow.com/a/57503862/4612476

  • PREPARE 对我有用,而不是 POSINSTALL。我只是在准备中运行了 npm run build 。 (2认同)

小智 8

只需使用命令即可npm install git+https://git@github.com/myRepo/angular-translate.git。谢谢。


Sim*_*mon 7

使用npm 5的用户的更新:

从npm @ 5开始,prepublish不推荐使用脚本。

使用prepare的构建步骤和prepublishOnly用于仅上载。

我发现"prepare": "npm run build"在脚本中添加A 可以解决所有问题。


Mik*_*e B 5

piggy带@RyanZim的出色答案,postinstall绝对是一个有效的选择。

请执行以下任一操作:

  1. 更新您的分叉存储库中的package.json,以将postinstall元素添加到脚本中。在这里,运行获取编译输出所需的任何内容(首选)。
  2. 更新您的package.json,并添加一个后安装,以更新node_modules中的必要目录。

如果您已经分叉了另一个人的存储库,那么可能值得提出一个问题来说明通过GitHub安装其软件包不起作用的问题,因为它没有提供构建脚本的必要方法。从那里,他们可以接受PR以在安装后解决该问题,也可以拒绝它,然后您可以执行#2。