我有一个haroku上托管的Rails Project ProjectX 。对于存储生产配置和文件,我正在使用不同的存储库 ProjectX-Config 。有可能:
- clone projectx-config,
- 删除当前的配置文件,
- Symlink配置文件到ProjectX-Config文件
请注意,这必须在Heroku上完成。我也知道,Heroku可以选择使用环境变量维护配置,但这不是我想要的。
谢谢!
不可能。
每个Dyno拥有自己的短暂文件系统,并带有新的副本 最近部署的代码。在Dyno的一生中运行 流程可以将文件系统用作临时刮擦板,但没有 编写的文件在任何其他Dyno中都可以看到,并且 在快速停止的那一刻或 重新启动。例如,这种情况发生在任何时候由于 申请部署,每天大约是正常的一部分 Dyno Management。
-https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem
或至少没有像设置这样的Rube Goldberg机器,您可以在其中设置某种自动化(例如邮政挂钩)以合并repo a和repo b并将结果推向Heroku。
我也相信,应用程序配置不应存在于环境变量中,因为它乏味而不是维护文件。
Heroku在这里不同意。
处理此类配置var的传统方法是将其放置 在源 - 在某种属性文件中。这是一 容易出错的过程,对于开源而言尤其复杂 通常必须使用单独(和私人)分支的应用 应用特定配置。
更好的解决方案是使用环境 变量,并将密钥排除在代码之外。在传统主机上或 在本地工作,您可以在BASHRC文件中设置环境VAR。在 Heroku,您使用config vars。 -https://devcenter.heroku.com/articles/config-vars
,尽管您可能高估了实际存储在env vars中的东西。您只需要存储诸如API键之类的秘密
中其他非秘密配置,例如各种宝石的设置可以并且应该在config/initializers
中设置。
如果您仍然认为使用GUI是可怕的,请使用您分析并使用的YAML文件来设置env vars:
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。