我正在使用 capistrano 部署 node.js 应用程序,并且在设置 shell 任务时遇到问题。例如,以为我安装了 npm 失败:
run "npm install"
未找到 npm
当我使用
run "/opt/nvm/'cat /opt/nvm/alias/default'/bin/npm install"
错误是找不到节点
部署由特定用户管理以进行部署。
您能否告诉可能导致此问题的原因以及如何解决?
我正在使用 capistrano 部署 node.js 应用程序,并且在设置 shell 任务时遇到问题。例如,以为我安装了 npm 失败:
run "npm install"
未找到 npm
当我使用
run "/opt/nvm/'cat /opt/nvm/alias/default'/bin/npm install"
错误是找不到节点
部署由特定用户管理以进行部署。
您能否告诉可能导致此问题的原因以及如何解决?
通过运行命令并首先获取文件,使用NVM和Capistrano对我有用。bash
nvm.sh
我的 NVM 安装在 中/opt/nvm
,因此npm install
任务可能如下所示:
namespace :npm do
desc 'Install the current npm environment.'
task :install do
invoke_command "bash -c '. /opt/nvm/nvm.sh && cd #{current_path} && npm install'", :via => run_method
end
end
因此无需通过从 NVM 读取别名文件来手动设置二进制文件的路径。
听起来 npm/node 可执行文件不在执行 Capistrano 脚本的远程用户的 $PATH 上。
您应该仔细检查 Capistrano 以哪个用户身份运行以及 $PATH 是什么(并根据需要进行更正)
我最后把这个添加到我的Capfile
set :default_environment, {
'PATH' => "$PATH:/usr/local/ruby/bin/:/home/ubuntu/.nvm/v0.10.21/bin"
}
与此同时(一年多前)我创建了一个 Capistrano 扩展以方便 nvm 的使用:https ://github.com/koenpunt/capistrano-nvm
默认情况下,扩展将映射node
和npm
,但您可以添加任何需要 nvm 运行的可执行文件(例如。grunt
)。
通过将以下内容添加到您的基本设置将起作用deploy.rb
:
require 'capistrano/nvm'
set :nvm_type, :user # or :system, depends on your nvm setup
set :nvm_node, 'v0.10.21'
set :nvm_map_bins, %w{node npm}
我能够通过在 capistrano 部署脚本中添加如下行来影响节点版本更改:
execute :'. ~/.nvm/nvm.sh && nvm use vOLDER_VERSION && nvm alias default vOLDER_VERSION'
execute :npm, 'install', '--silent --no-progress'
execute :npm, 'run', 'build'
execute :'. ~/.nvm/nvm.sh && nvm use stable && nvm alias default stable'
vOLDER_VERSION
选择的版本在哪里。
它的工作方式是获取 nvm,将其设置为使用指定的版本,并将该版本设置为默认值。然后在运行 npm 步骤后恢复这些更改。这样,部署的其他部分或其他部署仍然可以使用最新版本。
如果您不关心其他部署,您可以为您的部署用户运行一次该步骤:
su deployerUser
nvm use vOLDER_VERSION
nvm alias default vOLDER_VERSION