NPM安装和构建分叉github repo



我正在为我的angular应用程序使用一个名为angular-translate的模块。然而,我不得不对源代码进行一些小的修改,以使一切都按照我想要的方式工作,现在我想在npm install上持久化这些更改。一位同事建议我将源代码的repo分叉,并将我的分叉的repo作为一个依赖,我已经尝试过以下几种方式,例如

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

第一个给了我这样一个没有构建的目录。只是一个包裹。Json、.npmignore和一些markdown文件

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

第二个npm install给了我完整的repo,但是当我使用命令npm install angular-translate时,我又没有得到一个构建。我看过一些关于运行预发布脚本的讨论,但我不确定在安装所有模块时如何做到这一点。我也尝试过将fork作为我自己的模块发布到npm注册表,但我再次没有构建,我不确定这是正确的事情…

我为我对这个话题的无知道歉。我对npm没有太多的经验。希望能得到一些关于这个问题的反馈。当需要对包的源代码进行修改时,这似乎是一个常见的问题。也许有更好的解决办法?

试试npm install <ghusername>/<repoName>,其中<ghUsername>是您的GitHub用户名(没有@), <repoName>是存储库的名称。这样应该可以正确地安装它。您很可能希望在安装命令中使用--save--save-dev标志,以便在package.json中保存依赖关系。

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

如果安装命令花了很长时间,不要惊慌;从git仓库安装比从NPM注册表安装要慢。


编辑:

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

它是丑陋的,但在这种情况下,你将不得不从.gitignore中删除dist/,然后运行:

npm run build
git add .
git commit
git push

(确保您已经先运行了npm install)

你应该可以从github安装。

可能有另一种方法来做到这一点使用prepare脚本,但我不确定这是否可能;我从来没试过。编辑: Cameron Tacklind写了一个很好的答案,详细说明了如何做到这一点:https://stackoverflow.com/a/57829251/7127751

使用prepare脚本

别忘了 package.json#files .npmignore

发布到npmjs.com的代码通常不是包的存储库中的代码。"编译"是很常见的。将JavaScript源文件转换为库中一般使用的版本。这通常是发表在npmjs.com上的。

自动运行"build"是npm的一个特性。在发布(npm publish)之前的步骤。这最初被称为prepublish。Npm似乎认为在npm install上运行prepublish脚本会很方便,因为这是初始化开发环境的标准方式。

这最终导致了社区中的一些主要混乱。关于这个问题,Github上有很长的问题。

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

prepublishOnly符合您的期望。它不能在npm install上运行。许多包维护者只是盲目地切换到这个。

但是也有这个问题,人们不希望依赖npmjs.com来分发包的版本。Git存储库是很自然的选择。然而,不提交"编译"是常见的做法。文件到git。这就是prepare被添加来处理的…


prepare是正确的方式

如果你有一个包含源文件的存储库,但只有一个"build";步骤是必要的,
prepare在所有情况下都完全符合您的要求(截至npm 4)。

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

你甚至可以把你的构建依赖放在devDependencies中,它们将在prepare执行之前被安装。

下面是我的一个使用这种方法的包的例子。


.gitignore的问题

这个选项有一个让很多人感到困惑的问题。当准备一个依赖时,Npm和Yarn将只保留package.jsonfiles小节中列出的文件。

有人可能会看到files默认包含所有文件,并认为它们已经完成。很容易忽略的是,.npmignore 大部分覆盖了files指令,如果.npmignore不存在,则使用.gitignore

所以,如果你在.gitignore中列出了你的构建文件,像一个正常人一样,并且不做任何其他事情, prepare看起来破碎

如果你修复files只包括构建文件或添加一个空的.npmignore,你都设置好了。

我的建议

设置files(或者,反过来,.npmignore),使得实际发布的文件只有用户所需要的文件。Imho,没有必要在发布的包中包含未编译的源代码。


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

使用npm 5的用户更新:

从npm@5开始,prepublish脚本已被弃用。

使用prepare用于构建步骤,prepublishOnly用于仅上传。

我发现添加一个"prepare": "npm run build"脚本修复了我所有的问题。

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

借鉴@RyanZim的优秀答案,postinstall绝对是一个有效的选择。

  1. 更新包在分叉的repo中添加postinstall元素。在这里,运行任何你需要得到编译后的输出(首选)。
  2. 更新你的包。在node_modules中添加一个postinstall来更新所需的目录。

如果您已经fork了另一个人的存储库,那么可能值得提出一个问题来说明通过GitHub安装他们的包不起作用的问题,因为它不提供构建脚本的必要手段。在此基础上,他们可以接受PR并通过postinstall来解决这个问题,或者他们可以拒绝PR,而你可以执行第2条。

如果您像我一样使用yarn。假设你想使用这样一个包:yarn add ghasemikasra39/gridfs-easy --save,其中ghasemikasra39是用户名,gridfs-easy是repo的名称

最新更新