我正在使用Vagrant设置一个带有python,pip,virtualenv,virtualenvwrapper和一些要求的盒子.设置外壳程序脚本将the required lines for virtualenvwrapper添加到.bashrc.它进行了非常基本的检查,以确保它们还不存在,从而不会在每项设置中都重复它们:
if ! grep -Fq "WORKON_HOME" /home/vagrant/.bashrc; then
echo 'export WORKON_HOME=/home/vagrant/.virtualenvs' >> /home/vagrant/.bashrc
echo 'export PROJECT_HOME=/home/vagrant/Devel' >> /home/vagrant/.bashrc
echo 'source /usr/local/bin/virtualenvwrapper.sh' >> /home/vagrant/.bashrc
source /home/vagrant/.bashrc
fi
这似乎很好;设置完成后,这些行位于.bashrc中,我可以ssh到框中并使用virtualenvwrapper.
但是,virtualenvwrapper在配置期间不起作用.在以上部分之后,此下一步将检查pip要求文件并尝试使用virtualenvwrapper安装:
if [[ -f /vagrant/requirements.txt ]]; then
mkvirtualenv 'myvirtualenv' -r /vagrant/requirements.txt
fi
但这会产生:
==> default: /tmp/vagrant-shell: line 50: mkvirtualenv: command not found
如果我尝试从该Shell脚本中回显$WORKON_HOME,则不会显示任何内容.
我缺少那些可用的环境变量,因此virtualenvwrapper将运行吗?
更新:进一步尝试…似乎在我的shell脚本中执行源/home/vagrant/.bashrc没有影响-我可以在.bashrc文件中放入echo“ hello”,并且在配置期间不会输出(但是是在登录时是否运行源代码/home/vagrant/.bashrc.
我还尝试了在shell脚本中使用su -c“ source /home/vagrant/.bashrc”流浪汉,但这没有什么不同.
更新2:删除了$BASHRC_PATH变量,该变量使问题感到困惑.
更新3:在another question中,我得到了为什么源/home/vagrant/.bashrc无法正常工作的答案:.bashrc文件的第一部分阻止了它以“非交互方式”运行时无法执行任何操作.
解决方法:
Vagrant脚本供应商将以root身份运行,因此其主目录(〜)将为/ root.在脚本中,如果您定义BASHRC_PATH = / home / vagrant,那么我相信您的步骤将起作用:追加到/home/vagrant/.bashrc,然后从中进行采购.
更新:
抓紧我先前的想法^^,因为BASHRC_PATH已正确设置.
或者,我们可以使用.profile或.bash_profile.这是一个简化的示例,它设置环境变量FOO,使其在供应期间和ssh登录后可用:
流浪文件
Vagrant.configure(2) do |config|
config.vm.box = "hashicorp/precise32"
$prov_script = <<SCRIPT
if ! grep -q "export FOO" /home/vagrant/.profile; then
sudo echo "export FOO=bar" >> /home/vagrant/.profile
echo "before source, FOO=$FOO"
source /home/vagrant/.profile
echo "after source, FOO=$FOO"
fi
SCRIPT
config.vm.provision "shell", inline: $prov_script
end
结果
$vagrant up
...
==> default: Running provisioner: shell...
default: Running: inline script
==> default: before source, FOO=
==> default: after source, FOO=bar
$vagrant ssh -c 'echo $FOO'
bar
$vagrant ssh -c 'tail -n 1 ~/.profile'
export FOO=bar