Npm 安装和构建分支 github repo

我正在使用一个模块为我的角度应用程序称为角度翻译。然而,我不得不对源代码进行一些小的修改,以使一切按照我希望的方式运行,现在我想在 npm install上持久化这些更改。一个同事建议我分叉源代码的 repo,并指出我的分叉 repo 作为一个依赖项,我已经尝试过这些方法,例如。

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

第一个目录没有编译,只有 package.json、 . npmignore 和一些标记文件

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

第二个 npm install给了我完整的回购,但是同样的,我不会像使用命令 npm install angular-translate那样得到构建。我看到过一些关于运行预发布脚本的讨论,但是我不确定在安装所有模块时如何做到这一点。我还尝试将 fork 作为我自己的模块发布到 npm 注册表,但是同样没有得到 build,我不确定这样做是否正确..。

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

81322 次浏览

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

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

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


编辑:

您的问题是,在您的情况下,dist/没有提交到回购(因为它在 .gitignore中)。那才是真正的代码所在。dist/是在包发布到 npm 注册中心之前从 src/中的文件构建的,但是 dist/从未被提交到回购中。

这很难看,但是在这种情况下,您必须从 .gitignore中删除 dist/,然后运行:

npm run build
git add .
git commit
git push

(确保先运行了 npm install)

然后您应该能够从 github 安装。

可能还有另一种方法可以使用 prepare脚本来完成这项工作,但我不确定这是否可行; 我从未尝试过。卡梅隆塔克林德写了一个很好的答案详细说明如何做到这一点: https://stackoverflow.com/a/57829251/7127751

借鉴@RyanZim 出色的回答,postinstall绝对是一个有效的选择。

要么做下列事情之一:

  1. 在分支的 repo 中更新 package.json,为脚本添加一个 postinstall 元素。在这里,运行您需要的任何东西来获得已编译的输出(首选项)。
  2. 更新 package.json,并添加一个 postinstall,用于更新 node _ module 中所需的目录。

如果您已经创建了另一个人员存储库,那么可能需要提出一个问题来说明这个问题: 通过 GitHub 安装他们的包不起作用,因为它不提供构建脚本所需的方法。从那里,他们可以接受一个 PR 来解决这个问题,或者他们可以拒绝它,你可以做 # 2。

使用 npm 5的用户更新:

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

构建步骤使用 prepare,仅上载使用 prepublishOnly

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

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

DR 使用 prepare脚本

别忘了

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

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

这最终导致了社区中的一些重大混乱。

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

prepublishOnly做你所期望的。它不在 npm install上运行。许多软件包维护人员只是盲目地切换到这个。

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


prepare是正确的方法

如果您有一个包含源文件的存储库,但是使用它需要一个“构建”步骤,
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) ,使得仅有的文件 真的出版了是发布包的 用户所需要的文件。,没有必要在已发布的包中包含未编译的源代码。


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

如果你像我一样使用 yarn,假设你想使用像 这个这样的软件包: 其中 ghasemikasra39是用户名,gridfs-easy是回购的名称