如何直接从GitHub安装npm软件包?


870

尝试从github安装模块会导致:

package.json出现ENOENT错误。

使用express可以轻松复制:

npm install https://github.com/visionmedia/express 引发错误。

npm install express 作品。

为什么我不能从github安装?

这是控制台输出:

npm http GET https://github.com/visionmedia/express.git
npm http 200 https://github.com/visionmedia/express.git
npm ERR! not a package /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/tmp.tgz
npm ERR! Error: ENOENT, open '/home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.8.0-23-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "https://github.com/visionmedia/express.git"
npm ERR! cwd /home/guym/dev_env/projects_GIT/proj/somename
npm ERR! node -v v0.10.10
npm ERR! npm -v 1.2.25
npm ERR! path /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/guym/dev_env/projects_GIT/proj/somename/npm-debug.log
npm ERR! not ok code 0

1
谁能给package.json devDependencies格式?
亚当

1
@Adam,您可以添加"express": "github:visionmedia/express"到的"dependencies"部分package.json file,然后运行:(npm install如下所述)
Danny

@danny,这对我不起作用。我想知道是否在那个快速仓库中有一个dist文件夹来启用它。
ml242

Answers:


1157

因为https://github.com/visionmedia/express是网页的URL,而不是npm模块的URL。使用以下味道:

git+https://git@github.com/visionmedia/express.git

如果您需要SSH,也可以使用以下方法:

git+ssh://git@github.com/visionmedia/express.git

86
您也可以使用 git+https://github.com/visionmedia/express.git可以使用https而不是ssh。
史蒂夫·威尔考克

43
请注意,您要安装的存储库必须是一个npm模块,它必须包含一个package.json文件,否则您将收到此错误:Error: ENOENT, open 'tmp.tgz-unpack/package.json'
GabLeRoux 2014年

20
如果我想要一个特定的分支怎么办
怎么办

3
我目前唯一想到的解决方案是使用... / express.git#commit指定一个提交
Gaston Sanchez 2014年

39
值得一说的是,您可能需要转义#以使用Shell中的特定分支,即:npm install git+https://github.com/user/repo.git\#branch
mor

655

您也可以npm install visionmedia/express从Github安装

要么

npm install visionmedia/express#branch

还支持直接从Gist,Bitbucket,Gitlab和许多其他特殊格式进行安装。看着那(这npm install 所有文档


19
没有指定网址怎么办?npm如何知道您使用的是哪种托管服务?
杰克·雷森

22
@Jake Rayson:有可能从1.1.65版本开始github.com仅适用于该版本
ezze 2014年

5
在Windows上对我不起作用-它只是尝试从当前目录的子文件夹安装。
Jarrod Mosen 2014年

7
请注意,自npm 1.4.28起,此方法不适用于全局安装(即npm i repo / pkg -g)
user3751385 2015年

1
@ user3751385全局安装似乎在npm 3.3.8中起作用。
XåpplI'-I0llwlg'I -

170

如果未安装git,我们可以尝试

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master

10
好答案!它对我有用,而其他命令(来自其他答案)则停留在某些git fetching逻辑上。
Daniel Kmak 2015年

2
您也可以使用标签名称代替master。这样可能更安全。
mpen

4
尼斯当你与分支机构工作,你应该修改你的答案,包括通用格式的回答,我没有注意到/tarball/,在第一
鲁罗马

2
这是从Docker容器中安装依赖项时唯一对我有用的答案。
Fela Maslen

1
对于不需要下载整个仓库的情况,这也是完美的选择。谢谢!
索姆

58

2016年9月更新

现在可以从原始https github URL安装:

npm install https://github.com/fergiemcdowall/search-index.git

编辑1:有几个用户评论说您不能对所有模块都执行此操作,因为您正在从源代码控制系统读取数据,该系统很可能包含无效/未编译/错误的代码。因此要明确一点(尽管应该不用说):鉴于存储库中的代码处于npm-usable状态,您现在可以很高兴地直接从github安装

编辑2:(21-10-2019)我们现在生活在“峰值打字稿/反应/巴贝尔”中,因此JavaScript编译已变得相当普遍。如果您需要考虑编译问题,请参阅prepare。就是说,不需要编译NPM模块,并且明智的做法是假定编译不是默认的,特别是对于较旧的节点模块(也可能对于非常新的尖端“ ESNext” -y模块)。


9
您不能从其GitHub来源安装任何想要的npm软件包,除非该存储库包含一个dist文件夹,而大多数都没有。我链接到的问题是一个npm错误- prebuild从GitHub安装时,该步骤未运行。例如,尝试安装node-influx / node-influx
Dan Dascalescu

4
dist可以从GitHub安装不带文件夹的仓库,例如:npm install https://github.com/fergiemcdowall/search-index-adder完美运行。
Fergie

4
是的,因为您直接拥有usabel来源/lib(就像您有dist文件夹一样)。我的观点是,仅保证将回购的GitHub URL包含在package.jons中并不能保证安装该回购。例如,用TypeScript编写的模块需要将其已编译的代码推送到存储库中。他们通常不这样做,而是使用预发布脚本将.JS代码转储到dist文件夹中,该文件夹将被上传到npmjs.com。
Dan Dascalescu '16

2
我知道这有点晚了,但是窍门实际上是npm没有到Git存储库的一对一映射。一些项目在发布之前而不是在提交之前构建其源文件,这意味着它们不在Git仓库中,而是在npm包中-这样做的项目不能直接从Git工作。另一个失败的例子是宏存储库-例如,Babel的GitHub项目在子文件夹中包含数百个单独的npm软件包。它们可以单独发布,因为npm不会直接映射到Git。npm发布目录中的所有内容。
约翰·查德威克

13
对于以后偶然发现此问题的任何人...从npm5开始,npm将运行任何prepare脚本进行裸机“安装”,其中包括git deps。这意味着以上关于编译和dist文件夹的注释已过时。任何将其编译正确设置为在其上运行的包prepare都可以作为git dep正常工作,而无需将任何已编译资产提交到git中。
jasonkarns


37

彼得·里昂斯(Peter Lyons)当前的最高答案与最新的NPM版本无关。例如,现在可以使用在此答案中批评的相同命令。

$ npm install https://github.com/visionmedia/express

如果您仍然遇到问题,则可能是所使用的任何软件包都存在问题。


当您使用此命令时,它现在也会自动重定向到github.com/expressjs/express :)
Colin D

32

现在,npm的安装文档以及此处的许多其他答案已经很好地介绍了这些方法。

npm install git+ssh://git@github.com:<githubname>/<githubrepo.git[#<commit-ish>]
npm install git+ssh://git@github.com:<githubname>/<githubrepo.git>[#semver:^x.x]
npm install git+https://git@github.com/<githubname>/<githubrepo.git>
npm install git://github.com/<githubname>/<githubrepo.git>
npm install github:<githubname>/<githubrepo>[#<commit-ish>]

但是,最近发生的显着变化是npm添加了prepare脚本来替换prepublish脚本。 这解决了一个长期存在的问题,即通过git安装的模块无法运行prepublish脚本,因此无法完成将模块发布到npm注册表时发生的构建步骤。参见https://github.com/npm/npm/issues/3055

当然,模块作者将需要更新其package.json以使用new prepare指令来开始工作。


19

现在可以执行UPDATEnpm install git://github.com/foo/bar.git
或在中package.json

"dependencies": {
  "bar": "git://github.com/foo/bar.git"
}

19

语法的一般形式是

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

这意味着对于您的情况

npm install git+ssh://git@github.com/visionmedia/express.git

从npmjs文档:

npm安装:

从托管的git提供程序安装软件包,并使用git克隆它。对于完整的git远程URL,将仅尝试该URL。

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish>

| #semver:]是git,git + ssh,git + http,git + https或git + file之一。

如果提供了#,它将用于精确克隆该提交。如果commit-ish的格式为#semver :,可以是任何有效的semver范围或确切版本,并且npm会在远程存储库中查找与该范围相匹配的任何标记或引用,就像对注册表依赖项一样。如果#或

semver:指定,然后使用master。

如果存储库使用了子模块,那么这些子模块也将被克隆。

如果要安装的软件包包含prepare脚本,则在打包和安装软件包之前,将安装其依赖项和devDependencies,并运行prepare脚本。

以下git环境变量被npm识别,并在运行git时添加到环境中:

  • GIT_ASKPASS
  • GIT_EXEC_PATH
  • GIT_PROXY_COMMAND
  • GIT_SSH
  • GIT_SSH_COMMAND
  • GIT_SSL_CAINFO GIT_SSL_NO_VERIFY

有关详细信息,请参见git手册页。

例子:

npm install git+ssh://git@github.com:npm/npm.git#v1.0.27
npm install git+ssh://git@github.com:npm/npm#semver:^5.0
npm install git+https://isaacs@github.com/npm/npm.git
npm install git://github.com/npm/npm.git#v1.0.27
GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/npm.git npm install

14

直接安装:

npm install visionmedia/express

或者,您可以添加"express": "github:visionmedia/express"到文件"dependencies"部分package.json,然后运行:

npm install

9

你也可以

npm i alex-cory/fasthacks

要么

npm i github:alex-cory/fasthacks

基本上:

npm i user_or_org/repo_name

6

您可以通过npm install命令直接安装github存储库,如下所示: npm install https://github.com/futurechallenger/npm_git_install.git --save

注意:在将通过npm命令安装的仓库中:

  1. @Dan Dascalescu的评论说,也许您的存储库中必须有一个dist文件夹。
  2. 您一定要在回购中包含package.json!我忘了补充。

1
您的存储库中不需要dist文件夹或任何构建代码。您只需要在中使用prepare脚本即可package.json
卡梅伦·塔克林德


0

我尝试了一下,npm install git+https://github.com/visionmedia/express但是花了太长时间,我不确定那是否可行。

对我有用的是- yarn add git+https://github.com/visionmedia/express


-3

试试这个命令

 npm install github:[Organisation]/[Repository]#[master/BranchName] -g

这个命令对我有用。

 npm install github:BlessCSS/bless#3.x -g

12
不要在NPM安装中使用SUDO!而是使用chown更改所有者。
Marek Fajkus '16

版本是标签/分支名称还是package.json版本?
mfrachet

@MarekFajkus,如果您使用sudo通过软件包管理器在Linux上安装...如果要全局安装软件包,则必须使用root用户
Ray Foss

1
@RayFoss迟了一年,但是……仅当您希望全局安装的软件包可供所有用户使用时,这种情况很少发生。只需配置npm即可在中安装全局软件包~/node_modules,那么您就不需要sudo了。
Mr5o1
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.