npm 安装和构建 forked github repo

npm install and build of forked github repo

我正在为我的 angular 应用程序使用一个名为 angular-translate 的模块。但是,我不得不对源代码进行一些小的修改以使一切都按我想要的方式工作,现在我想在 npm install 上保留这些更改。一位同事建议我 fork 源代码的 repo 并指向我的 forked repo 作为依赖项,我已经尝试过这些方式,例如

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

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

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

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

对于我对这个话题的无知,我深表歉意。我对 npm 没有太多经验。希望就此问题获得一些反馈。当需要对包的源代码进行修改时,这似乎是一个很常见的问题?也许有更好的解决方案?

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

中的依赖项

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

如果安装命令耗时较长,请不要惊慌;从 git 存储库安装比从 npm 注册表安装慢。


编辑:

你的问题是,在你的情况下,dist/ 没有提交回购协议(因为它在 .gitignore 中)。这就是实际代码所在的地方。 dist/ 是在将包发布到 npm 注册表之前根据 src/ 中的文件构建的,但是 dist/ 从未提交到 repo。

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

npm run build
git add .
git commit
git push

(确保你先有运行 npm install

然后您应该可以从 github 安装。

可能还有另一种方法可以使用 prepare 脚本来执行此操作,但我不确定是否可行;我从来没有尝试过。 编辑: Cameron Tacklind 写了一个很好的答案,详细说明了如何做到这一点:

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

执行以下操作之一:

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

如果您 fork 了另一个人的存储库,那么可能值得提出一个问题来说明通过 GitHub 安装他们的软件包不起作用的问题,因为它没有提供构建脚本。从那里,他们可以接受 PR 以通过安装后解决此问题,或者他们可以拒绝它,您可以执行 #2。

使用 npm 5 的更新:

As of npm@5, prepublish scripts are deprecated.

Use prepare for build steps and prepublishOnly for upload-only.

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

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

TL;DR 使用 prepare 脚本

别忘了 package.json#files .npmignore

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

的内容

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

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

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

prepublishOnly 符合您的期望。 npm install 上没有 运行。许多软件包维护者只是盲目地转向了这个。

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


prepare是正确的方法

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

prepare: Run both BEFORE the package is packed and published, on local npm install without any arguments, and when installing git dependencies.

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

这里是an example我的一个使用这个方法的包。


.gitignore

有问题

这个选项有一个问题影响了很多人。 在准备依赖项时,Npm 和 Yarn 将保留 package.jsonfiles 部分中列出的文件。

人们可能会看到 files defaults to all files being included 并认为他们已经完成了。 容易被忽略的是 .npmignore mostly 覆盖 files 指令 ,如果 .npmignore 没有存在,使用 .gitignore 代替。

因此,如果您像一个正常人一样在 .gitignore 中列出了您构建的文件,并且不做任何其他事情,prepare好像坏了.

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

我的推荐

设置files(或者,通过倒置,.npmignore)使得实际发布的唯一文件是用户需要的文件 已发布的包。 恕我直言,没有必要在已发布的包中包含未编译的源代码。


原回答:

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