我正在为我的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 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上有很长的问题。
最后,为了不改变旧的行为,他们决定增加两个自动脚本:prepublishOnly
和prepare
。
prepublishOnly
符合您的期望。它不能在npm install
上运行。许多包维护者只是盲目地切换到这个。
但是也有这个问题,人们不希望依赖npmjs.com来分发包的版本。Git存储库是很自然的选择。然而,不提交"编译"是常见的做法。文件到git。这就是prepare
被添加来处理的…
prepare
是正确的方式
如果你有一个包含源文件的存储库,但只有一个"build";步骤是必要的,
prepare
在所有情况下都完全符合您的要求(截至npm 4)。
prepare
:在包被打包和发布之前,在本地npm install
上不带任何参数运行,以及在安装git依赖项时运行。
你甚至可以把你的构建依赖放在devDependencies
中,它们将在prepare
执行之前被安装。
下面是我的一个使用这种方法的包的例子。
.gitignore
的问题
这个选项有一个让很多人感到困惑的问题。当准备一个依赖时,Npm和Yarn将只保留在package.json
的files
小节中列出的文件。
有人可能会看到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
绝对是一个有效的选择。
- 更新包在分叉的repo中添加postinstall元素。在这里,运行任何你需要得到编译后的输出(首选)。
- 更新你的包。在node_modules中添加一个postinstall来更新所需的目录。
如果您已经fork了另一个人的存储库,那么可能值得提出一个问题来说明通过GitHub安装他们的包不起作用的问题,因为它不提供构建脚本的必要手段。在此基础上,他们可以接受PR并通过postinstall来解决这个问题,或者他们可以拒绝PR,而你可以执行第2条。
如果您像我一样使用yarn
。假设你想使用这样一个包:yarn add ghasemikasra39/gridfs-easy --save
,其中ghasemikasra39
是用户名,gridfs-easy
是repo的名称