【发布时间】:2014-11-10 21:38:21
【问题描述】:
作为制作我自己的使用 meanjs 的应用程序的起点,我访问了 meanjs 网站并使用他们的 yeomen 生成器来创建模板/示例应用程序。按照说明在我的本地台式机上运行开箱即用的示例应用程序可以在几分钟内完成。为了完成练习,我尝试在对其进行任何更改之前将示例应用程序部署到 AWS/EC2 实例。我过去使用过命令行部署工具并且很喜欢它。此外,现在您可以选择一个已经安装并准备好 node 和 npm 的 EC2 Linux 实例,这也很好。
将示例签入 git 后,我运行“git aws.push”来部署应用程序。
问题出在package.json这一行:
"postinstall": "bower install --config.interactive=false"
在 eb-activity.log 中:
npm WARN 无法在 wd meansample@0.0.1 bower install --config.interactive=false (wd=/tmp/deployment/application) 中运行
结果是 AngularJS 最终没有安装在 /public/lib 中。
我尝试的第一件事是在 package.json 文件中给出完整路径:node_modules/bower/bin/bower。这没有帮助并导致相同的错误。还要注意像“grunt”这样的其他命令不需要 package.json 中指定的完整路径,它们可以工作。
我对 aws.push 所做的黑盒魔法了解得不够多,无法理解为什么会发生此错误。例如,它以什么用户身份运行?该用户有什么权限?运行 npm install 时使用哪些选项(如果有)?
我确实想出了一个解决方法,但是如果 aws.push 能够直接运行 bower install,它会添加很多不需要的额外步骤。基本上我可以在连接到我的 EC2 实例的 ssh 客户端中手动运行 bower install,设置已安装文件的所有者/组,然后重新启动服务器。
解决步骤:
1) 在本地命令提示符下运行 git aws.push。等待不成功的部署完成。
2) 将 ssh 客户端连接到 EC2 实例。在命令提示符下:
cd /var/app/current
/* 注意:如果我不使用 sudo,我登录的 ec2user 没有权限创建 /public/lib 需要将 AngularJS 安装到 */
sudo node_modules/bower/bin/bower install --config.interactive=false --allow-root
/* 注意:只需更改所有者和组以与 aws.push 部署的其他文件相同 */
sudo chown -R nodejs public/lib
sudo chgrp -R nodejs public/lib
- 从 AWS 控制面板中,选择正确的 EC2 实例,Action = Restart App Server(s)
现在 AngularJS 已安装并且示例应用程序可以运行。
如何消除额外的步骤,让 aws.push 可以成功安装 bower?
【问题讨论】:
-
使用您的解决方法,我尝试将其转换为可能在安装后脚本中起作用的东西。我的想法是,如果我可以劫持相同的路径,以 root 身份运行,我就可以在部署中内联运行它。所以我尝试了这个:
"postinstall": "su -s /bin/sh -c PATH=$PATH:$NODE_HOME/bin ./node_modules/bower/bin/bower install --config.interactive=false --allow-root",但不幸的是,看起来部署的这个阶段发生在一个临时目录中,它不允许你在适当的位置执行:npm WARN cannot run in wd app@1.0.0 ... (wd=/tmp/deployment/application)
标签: amazon-web-services amazon-ec2 bower