164

我正在为我的 Angular 应用程序使用一个名为 angular-translate 的模块。但是,我不得不对源代码进行一些小的修改,以使一切按我想要的方式工作,现在我想将这些更改保留在npm install. 一位同事建议我 fork 源代码的 repo 并将我的 fork 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给了我完整的 repo,但是当我使用 command 时,我又没有得到一个构建npm install angular-translate。我已经看到一些关于运行预发布脚本的讨论,但我不确定在安装所有模块时如何执行此操作。我也尝试将 fork 作为我自己的模块发布到 npm 注册表,但我再次没有构建,我不确定这是正确的做法......

对于我对这个话题的无知,我深表歉意。我没有大量使用 npm 的经验。希望得到关于这个问题的一些反馈。当需要对包的源代码进行修改时,这似乎是一个足够普遍的问题?也许有更好的解决方案?

4

6 回答 6

174

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

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

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


编辑:

您的问题是,在您的情况下,dist/它没有提交给 repo(因为它在 中.gitignore)。那是实际代码所在的地方。dist/是从src/包发布到 npm 注册表之前的文件构建的,但从dist/不提交到 repo。

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

npm run build
git add .
git commit
git push

(确保您已npm install先运行)

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

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

于 2016-11-10T13:30:04.687 回答
32

TL;DR 使用prepare脚本

不要忘记 package.json#files .npmignore

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

它是如此普遍,以至于在发布之前npm自动运行“构建”步骤是一个特性( )。这最初被称为. 似乎 Npm 认为在 an 上运行脚本会很方便,因为这是初始化开发环境的标准方法。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和 Yarn 将保留.filespackage.json

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

因此,如果您将构建的文件列在 中.gitignore,就像一个理智的人一样,并且不做任何其他事情,prepare就会显得很糟糕

如果您修复files仅包含已构建的文件或添加一个空文件.npmignore,那么您就完成了。

我的推荐

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


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

于 2019-09-06T22:39:54.800 回答
22

使用 npm 5 的更新:

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

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

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

于 2018-05-23T14:09:05.730 回答
5

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

执行以下任一操作:

  1. 更新分叉存储库中的 package.json 以向脚本添加 postinstall 元素。在这里,运行任何你需要的东西来获得编译的输出(首选)。
  2. 更新你的 package.json,并添加一个 postinstall 来更新 node_modules 中的必要目录。

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

于 2018-04-05T10:00:37.697 回答
2

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

于 2018-11-16T11:31:14.100 回答
-1

如果你yarn像我一样使用。想象一下,你想使用这样的包其中 yarn add ghasemikasra39/gridfs-easy --saveghasemikasra39用户名,gridfs-easy是 repo 的名称

于 2020-10-19T09:40:47.747 回答