我对Ruby的了解很少,但我正在为我的办公室开发一个Vagrant VM。我在变量中配置了设置,以便我们的每个开发人员都可以轻松进行自定义,但是当我尝试从外部文件中包含变量时,我遇到了问题。
这是我正在做的事情的基本要点(这是有效的):
# Local (host) system info
host_os = "Windows"
nfs_enabled = false
# IP and Port Configuration
vm_ip_address = "33.33.33.10"
vm_http_port = 80
host_http_port = 8888
vm_mysql_port = 3306
host_mysql_port = 3306 # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
local_sites_path = "D:\\Web"
vm_sites_path = ENV["HOME"] + "/Sites"
# VM Configuration
vm_memory = "1024"
Vagrant.configure("2") do |config|
... do vagrant stuff here
但是,这不起作用(config.local.rb的内容与上面的变量声明匹配):
if(File.file?("config.local.rb"))
require_relative 'config.local.rb'
else
# Local (host) system info
host_os = "Mac"
nfs_enabled = true
# IP and Port Configuration
vm_ip_address = "33.33.33.10"
vm_http_port = 80
host_http_port = 8888
vm_mysql_port = 3306
host_mysql_port = 3306 # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
local_sites_path = ENV["HOME"] + "/Sites"
vm_sites_path = ENV["HOME"] + "/Sites"
# VM Configuration
vm_memory = "512"
end
Vagrant.configure("2") do |config|
... do vagrant stuff here
这里有什么想法吗?在这两种情况下,变量声明都位于文件的顶部,因此我的理解是它们应该在全局范围内。
以下是config.local.rb的内容:
# Duplicate to config.local.rb to activate. Override the variables set in the Vagrantfile to tweak your local VM.
# Local (host) system info
host_os = "Windows"
nfs_enabled = false
# IP and Port Configuration
vm_ip_address = "33.33.33.10"
vm_http_port = 80
host_http_port = 8888
vm_mysql_port = 3306
host_mysql_port = 3306 # Warning, mysql port configuration using 3306 will interfere with any locally run MySQL server.
local_sites_path = "D:\\Web"
vm_sites_path = ENV["HOME"] + "/Sites"
# VM Configuration
vm_memory = "1024"
正如我所说,我之前并没有真正使用过Ruby,但我所知道的关于编程和范围的一切都说这应该可以正常工作。我已检查(使用print
语句)脚本正在检测并包含该文件,但由于某种原因它不起作用,除非我直接在Vagrantfile中硬编码配置设置。
提前致谢。
答案 0 :(得分:1)
以小写字母开头的变量是局部变量。它们被称为“本地”变量,因为它们是定义它们的范围的本地变量。在您的情况下,它们是config.local.rb
的脚本主体的本地变量。除config.local.rb
的脚本主体外,无法从其他任何位置访问它们。这就是他们“本地化”的原因。
如果需要全局变量,则需要使用全局变量。全局变量以$
符号开头。
答案 1 :(得分:0)
Jorg对本地变量和全局变量的解释是正确的。下面是一个可能的替代实现,可能会按照您的意愿执行。
在config.local.rb
中将您的配置声明为哈希:
{
host_os: "Windows",
nfs_enabled: false
# etc, etc.
}
在您的其他档案中:
if File.exist?("config.local.rb"))
config = File.read("config.local.rb")
else
config = {
host_os: "Mac",
nfs_enabled: true
# etc, etc.
}
end
您的config
哈希现在拥有您的所有数据。
如果这种方法看起来更符合您的需求,那么您应该将配置数据放在YAML文件而不是Ruby文件中:How do I parse a YAML file?