在Heroku上使用npm和Node的Git依赖项

32
我有一个 package.json 文件:
{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "coffee-script": "1.1.3"
    , "express": "2.5.0"
    , "less": "1.1.5"
    , "jade": "0.17.0"
    , "connect-redis": "1.2.0"
    , "hiredis": "0.1.13"
    , "redis": "0.7.1"
    , "bcrypt": "0.4.1"
    , "promised-io": "0.3.0"
    , "jugglingdb": "git://github.com/juggy/jugglingdb.git#master"
    , "nodemailer": "0.2.3"
  }
}

我想要将应用部署到Heroku。在本地使用 npm 版本 1.0.105 可以正常运行,但在 Heroku 上出现了问题(我也已经将其更新为1.0.105):

   -----> Heroku receiving push
   -----> Fetching custom build pack... done
   -----> Node.js app detected
   -----> Fetching Node.js binaries
   -----> Vendoring node 0.4.7
   -----> Installing dependencies with npm 1.0.105
          npm ERR! git checkout master fatal: Not a git repository: '.'
          npm ERR! Error: `git "checkout" "master"` failed with 128
          npm ERR!     at ChildProcess.<anonymous> (/tmp/node-npm-Jb2d/lib/utils/exec.js:49:20)
          npm ERR!     at ChildProcess.emit (events.js:67:17)
          npm ERR!     at ChildProcess.onexit (child_process.js:192:12)
          npm ERR! Report this *entire* log at:
          npm ERR!     <http://github.com/isaacs/npm/issues>
          npm ERR! or email it to:
          npm ERR!     <npm-@googlegroups.com>
          npm ERR! 
          npm ERR! System Linux 2.6.32-316-ec2
          npm ERR! command "/tmp/node-node-C3jD/bin/node" "/tmp/node-npm-Jb2d/cli.js" "install"
          npm ERR! cwd /tmp/build_2yzg7lk83o5m9
          npm ERR! node -v v0.4.7
          npm ERR! npm -v 1.0.105
          npm ERR! git checkout master fatal: Not a git repository: '.'
          npm ERR! 
          npm ERR! Additional logging details can be found in:
          npm ERR!     /tmp/build_2yzg7lk83o5m9/npm-debug.log
          npm not ok
    !     Failed to install dependencies with npm
    !     Heroku push rejected, failed to compile Node.js app 

另外,我似乎找不到在 /tmp 中访问该日志文件的方法。

有人成功在Heroku上部署Git依赖项吗(在Ruby方面运行良好:P)?


看起来像是一个 bug,你已经报告了吗? - Farid Nouri Neshat
Heroku已经沉默了一个星期了.... - Julien
这不是Heroku的问题,我认为更像是一个NPM的bug(我觉得很明显...) - Farid Nouri Neshat
为什么这样呢?在我的本地安装上它是可以运行的... - Julien
1
看起来使用 Github 下载选项卡中的 tarball 链接而不是 git 链接是有效的... 我现在会使用它。 - Julien
7个回答

80

顺便提一句,如果代码存储在GitHub上,你只需要指定 用户名/仓库名 ,npm 就会为您完成剩下的部分。

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "coffee-script": "1.1.3"
    , "express": "2.5.0"
    , "less": "1.1.5"
    , "jade": "0.17.0"
    , "connect-redis": "1.2.0"
    , "hiredis": "0.1.13"
    , "redis": "0.7.1"
    , "bcrypt": "0.4.1"
    , "promised-io": "0.3.0"
    , "jugglingdb": "juggy/jugglingdb"
    , "nodemailer": "0.2.3"
  }
}

或者

指定一个 (git/git+ssh/git+http/git+https)://user@host/repo.git 的URL。

完全记录在案


好的。我该如何指定一个分支? - betzerra
4
我认为那是 juggy/jugglingdb#master,但不确定。 - Matej

43

我不了解这个包,但我有其他使用以下语法的包可以工作。在Heroku上,使用http引用到tar.gz文件。

package.json:

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "coffee-script": "1.1.3"
    , "express": "2.5.0"
    , "less": "1.1.5"
    , "jade": "0.17.0"
    , "connect-redis": "1.2.0"
    , "hiredis": "0.1.13"
    , "redis": "0.7.1"
    , "bcrypt": "0.4.1"
    , "promised-io": "0.3.0"
    , "jugglingdb": "https://github.com/juggy/jugglingdb/tarball/master"
    , "nodemailer": "0.2.3"
  }
}

是的,这个对我起作用了。语法是:https://github.com/:organization/:repo/tarball/master - Dan Kohn
1
工作得非常完美。我以为我遇到了代理问题,但事实证明我瞄准的地方不对。 - JWally
1
我必须使用上述URL重定向到的URL https://codeload.github.com/:org/:repo/legacy.tar.gz/master - Jesse Hattabaugh
1
我在2021年尝试过了,可以说添加/tarball/master仍然有效。谢谢! - kennysong
我在 package.json 文件中更改了一个库的依赖,如下所示:dependencies { "mux.js": "https://from_github" }。现在我可以在 node_modules/mux.ts/lib/m2ts/m2ts.js 文件中看到我的代码。但是构建项目时仍然使用旧的代码,即 dist/video.js 文件。尝试过 npm install && npm update && npm run build,但没有帮助。有什么想法吗? - Whome
显示剩余2条评论

12
问题出在Heroku的nodejs构建包上。我已经向Heroku提交了一个修复的Pull Request,但我不知道他们会不会回应。幸运的是,有一种文档记录不太好的方法可以使用自定义构建包来解决这个问题。我已经分叉了Heroku的nodejs构建包并修复了这个问题 - 可以在此处找到:https://github.com/chrisleishman/heroku-buildpack-nodejs/tree/git_fix
要使用这个方法,最好创建自己的github分支 https://github.com/heroku/heroku-buildpack-nodejs,然后合并我的chrisleishman/git_fix分支。例如(在分叉之后):
git clone git@github.com:@YOUR-GITHUB-NAME@/heroku-buildpack-nodejs.git
cd heroku-buildpack-nodejs
git remote add chrisleishman git://github.com/chrisleishman/heroku-buildpack-nodejs.git
git fetch chrisleishman
git merge chrisleishman/git_fix
git push

您可以将 BUILDPACK_URL 配置变量添加到您的 Heroku 应用中。例如:

heroku config:add BUILDPACK_URL="git://github.com/@YOUR-GITHUB-NAME@/heroku-buildpack-nodejs.git
下一次推送到Heroku应该使用自定义的构建包,其中包含修复程序。

很好,它正在工作。如果我更改git哈希而不更改package.json版本,您知道依赖包是否会更新吗? - Julien
不,它们不会。这是npm中的一个错误。 - Chris Leishman
7
我相信这个修复程序现在已经合并到标准 Buildpack 中了,因此不再需要这个解决方法。 - Chris Leishman
1
对于任何想引用 GitHub 存储库的人,这里有一个提示:确保在 package.json 中使用“Git 只读”URL。如果您使用其中一个私有 URL,则会收到不同于上面那个错误但类似的结果。只读 URL 可以正常工作。 - JBCP

4
请注意,您可以指定 commit-ish 来选择要安装的提交/分支/...,格式为"user/foo-project#commit-ish",请参阅文档
例如:
"dependencies": {
    "express": "visionmedia/express#some-branch",
    "mocha": "visionmedia/mocha#4727d357ea"
}

2

1
我遇到了类似的问题,但是我的问题涉及私有 Git 仓库。我的解决方案是添加一个 postinstall 脚本,内容如下:
{
    "postinstall": "npm update && npm install package-name"
}

更新和安装会使npm将私有仓库更新到最新版本。(https://github.com/npm/npm/issues/1727)

0

如果有人在使用npm 5+(其中package-lock.json是一种东西)时遇到问题,请确保通过命令行安装软件包。

npm i my_package --save https://github.com/username/repo/archive/v6.5.2.tar.gz

从NPM 5.0.3开始,仅将其添加到package.json并运行npm i将不会更新package-lock.json(grrr)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接