मैं बावर्ची रसोई की किताब के लिए पैरामीटर पारित करने के लिए एक रास्ता देख रहा हूँ जैसे:
$ vagrant up some_parameter
और फिर some_parameter
शेफ कुकबुक में से एक के अंदर का उपयोग करें ।
मैं बावर्ची रसोई की किताब के लिए पैरामीटर पारित करने के लिए एक रास्ता देख रहा हूँ जैसे:
$ vagrant up some_parameter
और फिर some_parameter
शेफ कुकबुक में से एक के अंदर का उपयोग करें ।
जवाबों:
आप आवारा किसी भी पैरामीटर को पारित नहीं कर सकते। एकमात्र तरीका पर्यावरण चर का उपयोग करना है
MY_VAR='my value' vagrant up
और ENV['MY_VAR']
नुस्खा में उपयोग करें ।
आप GetoptLong Ruby लाइब्रेरी को भी शामिल कर सकते हैं जो आपको कमांड लाइन विकल्पों को पार्स करने की अनुमति देती है।
Vagrantfile
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
Vagrant.configure("2") do |config|
...
config.vm.provision :shell do |s|
s.args = "#{customParameter}"
end
end
फिर, आप चला सकते हैं:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
नोट: सुनिश्चित करें कि अमान्य विकल्प सत्यापन त्रुटि से बचने के लिए कस्टम कमांड योनि कमांड से पहले निर्दिष्ट किया गया है।
पुस्तकालय के बारे में अधिक जानकारी यहाँ ।
opts
संसाधित नहीं हैं:vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
पर्याप्त होना चाहिए
ARGV से चर पढ़ना संभव है और फिर कॉन्फ़िगरेशन चरण पर आगे बढ़ने से पहले उन्हें इससे हटा दें। यह ARGV को संशोधित करने के लिए icky लगता है, लेकिन मैं कमांड-लाइन विकल्पों के लिए कोई अन्य तरीका नहीं खोज सका।
# Parse options
options = {}
options[:port_guest] = ARGV[1] || 8080
options[:port_host] = ARGV[2] || 8080
options[:port_guest] = Integer(options[:port_guest])
options[:port_host] = Integer(options[:port_host])
ARGV.delete_at(1)
ARGV.delete_at(1)
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Create a forwarded port mapping for web server
config.vm.network :forwarded_port, guest: options[:port_guest], host: options[:port_host]
# Run shell provisioner
config.vm.provision :shell, :path => "provision.sh", :args => "-g" + options[:port_guest].to_s + " -h" + options[:port_host].to_s
port_guest=8080
port_host=8080
while getopts ":g:h:" opt; do
case "$opt" in
g)
port_guest="$OPTARG" ;;
h)
port_host="$OPTARG" ;;
esac
done
puts ARGV
प्रदर्शित करता है अतिरिक्त कस्टम तर्क को हटाने के बाद सही सरणी।
puts "#{ARGV}"
लाइन डालता हूं vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
और यह वैग्रांटीफाइल में संबंधित आर्गन्स को हटाने से पहले उस लाइन को प्रिंट करता है, इस प्रकार अर्थ यह है कि निष्कासन निरर्थक है क्योंकि ARGV सत्यापनकर्ता के पास जाता है जो An invalid option was specified
किसी भी आउटपुट के लिए है संचालन ARGV पर हो सकता है।
@ बेंजामिन-गॉथियर का गेटॉप्लॉन्ग सॉल्यूशन वास्तव में साफ-सुथरा है, जो रूबी और योनि के प्रतिमान के साथ अच्छी तरह से फिट बैठता है।
हालांकि, योनि तर्कों की स्वच्छ हैंडलिंग को ठीक करने के लिए एक अतिरिक्त पंक्ति की आवश्यकता होती है, जैसे कि vagrant destroy -f
।
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.ordering=(GetoptLong::REQUIRE_ORDER) ### this line.
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
जब कस्टम विकल्प संसाधित किए जाते हैं तो कोड के इस ब्लॉक को रोकने की अनुमति देता है। तो अब,
vagrant --custom-option up --provision
या
vagrant destroy -f
सफाई से संभाला जाता है।
उम्मीद है की यह मदद करेगा,
Vagrant.configure("2") do |config|
class Username
def to_s
print "Virtual machine needs you proxy user and password.\n"
print "Username: "
STDIN.gets.chomp
end
end
class Password
def to_s
begin
system 'stty -echo'
print "Password: "
pass = URI.escape(STDIN.gets.chomp)
ensure
system 'stty echo'
end
pass
end
end
config.vm.provision "shell", env: {"USERNAME" => Username.new, "PASSWORD" => Password.new}, inline: <<-SHELL
echo username: $USERNAME
echo password: $PASSWORD
SHELL
end
end