我有一个Rails项目 PROJECTX ,它在Heroku上托管。为了存储生产配置和文件,我使用不同的存储库 PROJECTX-config 。有可能:
请注意,这必须在Heroku上完成。另外我知道Heroku可以选择使用环境变量来维护配置,但这不是我想要的。
谢谢!
答案 0 :(得分:2)
不可能。
每个dyno都有自己的短暂文件系统,并带有新的副本 最近部署的代码。在dyno的一生中它的运行 进程可以使用文件系统作为临时暂存器,但没有 写入的文件对任何其他dyno和中的进程可见 写入的任何文件将在dyno停止时丢弃 重新启动。例如,每次更换dyno时都会发生这种情况 应用程序部署和大约每天一次作为正常的一部分 dyno management。
- https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem
或者至少没有没有像setupe这样的Rube Goldberg机器,你设置某种自动化(如提交后挂钩)来合并repo A和repo B并将结果推送到heroku。
另外我认为应用配置不应该出现在环境变量中,因为维护而不是维护文件是很繁琐的。
Heroku在这里不同意。
处理此类配置变量的传统方法是放置它们 在源下 - 在某种属性文件中。这是个 容易出错的过程,对于开源来说尤其复杂 通常需要维护单独(和私有)分支的应用程序 特定于应用的配置 更好的解决方案是使用环境 变量,并保持密码不在代码中。在传统的主机或 在本地工作,您可以在bashrc文件中设置环境变量。上 Heroku,你使用配置变量。 - https://devcenter.heroku.com/articles/config-vars
虽然您可能高估了实际需要存储在ENV vars中的内容。您只需要在ENV中存储秘密,例如API密钥。
其他非秘密配置,您可以并且应该在config/initializers
设置各种宝石的设置。
如果您仍然认为使用GUI非常糟糕,请使用您解析并用于设置ENV变量的YAML文件:
require 'yaml'
yaml = YAML.load_file(File.join(__dir__, 'conf.yml'))
def create_key(*components)
components.join('_').upcase
end
env_vars = yaml["production"].each_with_object({}) do |(key,value), memo|
key_components = [key]
if value.kind_of? Hash
value.each_pair do |k,v|
memo[create_key(*key_components.dup.push(k))] = v
end
else
memo[create_key(*key_components)] = value
end
end.each do |k,v|
system("heroku config:set #{k}=#{v}")
puts "Setting #{k} = #{v}; #{ $? }"
end
或者您甚至可以将序列化表单(JSON或YAML)存储在单个env var中 - 但总大小限制为32kb。