我正在尝试使用vagrant自动化我的开发盒。我需要与其他开发人员共享vagrant设置,因此我们需要确保在正常的vagrant up
进程开始之前已满足某些边界条件。
在流浪汉中是否有任何钩子(如git,pre-commit或其他pre-*脚本)?提供脚本太晚了。
我目前的设置如下:
Vagrantfile
vagrant-templates/
vagrant-templates/apache.conf
vagrant-templates/...
sub-project1/
sub-project2/
我需要确定,子项目{1..n}存在,如果不存在,则应该有错误消息。
我更喜欢类似bash的解决方案,但我对其他解决方案持开放态度。
答案 0 :(得分:25)
你可以尝试一下我写的这个Vagrant插件:
https://github.com/emyl/vagrant-triggers
安装完成后,您可以将您的Vagrant文件放入:
config.trigger.before :up, :execute => "..."
答案 1 :(得分:11)
一种选择是将逻辑直接放入Vagrantfile。然后它将在项目中的所有vagrant
命令上执行。例如:
def ensure_sub_project(name)
if !File.exists?(File.expand_path("../#{name}", __FILE__))
# you could raise or do other ruby magic, or shell out (for a bash script)
system('clone-the-project.sh', name)
end
end
ensure_sub_project('some-project')
ensure_sub_project('other-project')
Vagrant.configure('2') do |config|
# ...
end
答案 2 :(得分:5)
可以为vagrant编写自己的插件,并在machine_action_up上使用action_hook,例如:
require 'vagrant-YOURPLUGINNAME/YOURACTIONCLASS'
module VagrantPlugins
module YOURPLUGINNAME
class Plugin < Vagrant.plugin('2')
name 'YOURPLUGINNAME'
description <<-DESC
Some description of your plugin
DESC
config(:YOURPLUGINNAME) do
require_relative 'config'
Config
end
action_hook(:YOURPLUGINNAME, :machine_action_up) do |hook|
hook.prepend(YOURACTIONCLASS.METHOD)
end
end
end
end
答案 3 :(得分:4)
另一个要签出的插件是vagrant-host-shell,只有在配置框时才会运行。只需在Vagrantfile中的其他提供者之前添加它:
config.vm.provision :host_shell do |shell|
shell.inline = './clone-projects.sh'
shell.abort_on_nonzero = true
end
答案 4 :(得分:2)
..添加到tmatilai的答案,您可以添加如下内容:
case ARGV[0]
when "provision", "up"
system "./prepare.sh"
else
# do nothing
end
进入您的Vagrantfile,以便它只能在特定命令上运行。