npm安装和构建派生的github存储库


125

这不是一个全新的问题,但是我已经寻找了好一阵子,但是却找不到解决方案。

我正在为我的角度应用程序使用一个名为angular-translate的模块。但是,我必须对源代码进行一些小的修改,以使所有内容都能按我希望的方式工作,现在我想将这些更改保留在上npm install。一位同事建议我分叉源代码的存储库,并把我的分叉存储库作为依赖项,我已经尝试过这些方式,例如

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给了我完整的仓库,但同样,我没有像使用command那样的构建npm install angular-translate。我已经看到了运行预发布脚本的麻烦,但是我不确定在安装所有模块时如何执行此操作。我也曾尝试将fork作为我自己的模块发布到npm注册表中,但是同样我没有构建,而且我不确定这是正确的做法...

我对此主题的无知表示歉意。我对npm经验不足。希望获得有关此问题的一些反馈。当需要对包的源代码进行修改时,这似乎是一个足够普遍的问题?也许有更好的解决方案?在此先感谢您的帮助。

Answers:


139

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

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

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


编辑:

您的问题是,就您而言,dist/它没有提交给回购协议(因为它位于中.gitignore)。这就是实际代码所在的地方。dist/是从src/软件包发布到npm注册表之前的文件构建的,但dist/从未提交回购协议。

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

npm run build
git add .
git commit
git push

(确保您先运行npm install

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

可能还有另一种使用postinstall脚本执行此操作的方法,但是我不确定是否可行。我从来没有尝试过。


2
是的,那几乎就是解决方案。还必须做一个npm安装并修改GruntFile一点,但这使它起作用。感谢您的帮助:)
hughesjmh

2
除了忽略dist之外,真的没有其他方法可做吗?我想对原始存储库进行公关,但与发行人联系,他会不会喜欢?
卡莫

7
@KaMok我认为另一种选择是,在package.json您的fork文件中scripts,将其重命名prepublishprepare。看来当npm installnpm install github:user_name/fork_name --save(和同为纱线)执行它也运行有什么在prepare脚本。假设prepublish此程序包的脚本创建了构建文件,通常是这种情况。
大卫

5
,如果您需要特定的分支机构,请npm install <ghusername>/<repoName>#branchName
参阅

2
@RyanZim您不正确。只要安装正确,从git安装就可以很好地工作。docs.npmjs.com/cli/install “如果正在安装的软件包中包含一个prepare脚本,它dependenciesdevDependencies将被安装,并准备脚本将运行,打包和安装包之前。”
卡梅隆·塔克林德

15

使用npm 5的用户的更新:

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

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

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


这也对我有用(用我刚做的叉子)-谢谢!我想知道...为什么不是默认情况下所有软件包都只包含此脚本配置?是因为软件包作者只考虑了从npm安装软件包的用例,而不是从git repo安装软件包的用例?因此,它们只是习惯于手动运行npm run buildnpm run publish并且除非遇到某天尝试通过git安装存储库的情况,否则不会遇到任何问题或痛苦?
泰勒·里克

9

发布到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和Yarn将保留的files部分中列出的文件package.json

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

所以,如果你有在列出的内置文件.gitignore就像一个理智的人,并没有其他人做任何事情,prepare都会显得

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

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


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


1
PREPARE为我工作,而不是POSTINSTALL。我只是在prepare中运行npm run build。
Milind

6

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

请执行以下任一操作:

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

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


您能解释或掌握有关如何做#2的任何资源吗?当gitrepo仅包含src而非dist时,我需要在npm安装后运行哪些命令
Daniel Daniel

1
@Daniel歉意,我想回想一下我过去做此事的背景。我认为通过#2,我的意思是在您的主要package.json中添加一个后安装步骤,该步骤将为最佳答案运行这些步骤,因此,应采取类似的措施"postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"以确保引起麻烦的软件包在应用程序运行之前就已构建。如前所述,尽管如此,我还是更喜欢将回购分叉给自己的用户,将后安装添加到程序包本身,并在我的应用程序中使用的方法。
Mike B

我认为应该首选添加prepare(@Simon的答案),因为如果从npm安装,则无需进行任何其他构建,因为它应该已经包含dist / dir。请参阅docs.npmjs.com/misc/scripts:“准备:在打包和发布软件包之前,以及在安装git依赖项时都运行”
Tyler Rick

postinstall距离正确的解决方案仅一步之遥。只需使用prepare。是2020
。–卡梅隆·塔克林德

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.