Node.js Heroku部署 - 无法执行Postinstall脚本安装Bower

时间:2013-12-29 15:14:16

标签: javascript node.js heroku bower

将我的Node.js MEAN应用程序部署到heroku失败,出现以下错误。我无法弄清楚凉亭安装有什么问题...

以下是错误消息:

2606 info postinstall App@1.0.0
2607 verbose unsafe-perm in lifecycle true
2608 info App@1.0.0 Failed to exec postinstall script
2609 error App@1.0.0 postinstall: `./node_modules/bower/bin/bower install`
2609 error Exit status 1
2610 error Failed at the App@1.0.0 postinstall script.
2610 error This is most likely a problem with the App package,
2610 error not with npm itself.
2610 error Tell the author that this fails on your system:
2610 error     ./node_modules/bower/bin/bower install
!     Push rejected, failed to compile Node.js app

这是我的Bower.json

    {
  "name": "mean",
  "version": "1.0.0",
  "dependencies": {
    "bootstrap": "*",
    "angular": "*",
    "angular-resource": "*",
    "angular-cookies": "*",
    "angular-ui-utils": "*",
    "angular-bootstrap": "*",
    "json3": "*",
    "jquery": "*",
    "angular-ui-router": "*",
    "angular-animate": "*",
    "move.js": "git://github.com/visionmedia/move.js.git#~0.3.3",
    "animate.css": "*",
    "ngAnimate-animate.css": "*",
    "angularLocalStorage": "~0.1.7",
    "jquery-nicescroll": "*"
  },
  "resolutions": {
    "angular": "1.2.4"
  }
}

这是我的Package.json

"scripts": {
    "start": "node node_modules/grunt-cli/bin/grunt",
    "test": "node node_modules/grunt-cli/bin/grunt test",
    "postinstall": "./node_modules/bower/bin/bower install"
},

5 个答案:

答案 0 :(得分:12)

我也犯了这个错误。由于bower postinstall,每三次推送到heroku失败。

虽然这不是一个强有力的解决方案,但我并不完全理解为什么它会有所帮助!但这使我感到困扰,所以希望能帮助别人。

尽管将/ lib文件夹添加到.gitignore,但在部署heroku之前强制添加它

git add -f public/lib
git commit -m "force add bower libs"
git push heroku master

答案 1 :(得分:12)

这可能与凉亭的这个问题有关,其原因目前仍在调查中:

https://github.com/bower/bower/issues/933

我也遇到过类似问题bower install命令在heroku上失败了。这对我有用:

<强> 1。暂时从node_modules删除bower_components.gitignore

  • 尝试使用bower通过heroku中的安装后脚本安装Angular时,似乎修复了ENOENT错误。
  • 注意:如果您为.bowerrc文件中的bower组件指定了不同的安装目录,请确保.gitignore中的目录

<强> 2。编辑(或创建).bowerrc并告诉它使用项目目录本地的临时目录:

{
    "storage": {
        "packages": ".bower-cache",
        "registry": ".bower-registry"
    },
    "tmp": ".bower-tmp"
}
  • 默认情况下,bower试图使用/app中的目录,这导致ENOTEMPTY错误(可能是因为它试图清除这些目录,但它没有访问权限,因为它们与其他用户共享?只是猜不出......)
  • 使用项目本地的目录修复了冲突。

希望这有助于其他人。

注意:即使执行了上述步骤,bower install命令仍可能偶尔失败。但是,它通常可以在第二次或第三次运行 - 只需再次尝试运行命令......直到底层问题得到解决,这是我能提供的最佳建议。

答案 2 :(得分:6)

我有同样的问题。问题出在bower.json文件中:

{
    "name": "mean",
    "version": "0.1.3",
    "dependencies": {
        "angular": "1.2.8",
        "angular-resource": "latest",
        "angular-cookies": "latest",
        "angular-mocks": "latest",
        "angular-route": "latest",
        "bootstrap": "3.0.3",
        "angular-bootstrap": "0.10.0",
        "angular-ui-utils": "0.1.0"
    }
}

“bower install”无法确定角度版本,需要手动干预才能选择正确的版本:

Unable to find a suitable version for angular, please choose one:
    1) angular#1.2.8 which resolved to 1.2.8 and has mean as dependants
    2) angular#1.2.9 which resolved to 1.2.9 and has angular-cookies#1.2.9, angular-mocks#1.2.9, angular-resource#1.2.9, angular-route#1.2.9 as dependants
    3) angular#>= 1.0.2 which resolved to 1.2.10-build.2176+sha.e020916 and has angular-ui-utils#0.1.0 as dependants
    4) angular#>=1 which resolved to 1.2.10-build.2176+sha.e020916 and has angular-bootstrap#0.10.0 as dependants
Prefix the choice with ! to persist it to bower.json
[?] Answer: 

因此Heroku在执行脚本时失败。

<强> FIX

只需更改bower.json文件中的角度版本:

"angular": "1.2.10",

1.2.9也可以。

答案 3 :(得分:4)

@ ac360这根本不是凉亭的问题。如果不同的库使用相同的依赖关系(不同版本),通常会发出警告。您永远不应该添加public/lib to the repo。这违背了凉亭的用途。让您的repo尽可能轻松,让依赖项在构建时下载并解析,这样您就可以在bower.json

中定义的参数中获得最新和最好的内容

要完全解决此问题以进行自动部署,bower会在名为bower.json的{​​{1}}上为我们提供一个属性

只需在resolutions

中创建以下内容即可
bower.json

即使您已经定义了解决方案,您仍然遇到问题的原因是因为您选择的版本不会满足所有依赖项,因此在heroku安装期间出现了问题。

或者,您可以在本地构建,当您被问到可供选择的版本时,如果您在数字选项之前加上bang "resolutions": { "ember": "1.2.10" } 符号,bower将为您更新bower.json!

请参阅:https://github.com/bower/bower/issues/532

答案 4 :(得分:3)

我通过确保使用以下命令在package.json中保存bower来实现它。在尝试运行bower install

之前,save将在服务器上使用npm安装bower
npm install bower --save

package.json中的postinstall脚本 “postinstall:”bower install“之后在heroku工作。