2

我有一个 Rails 项目PROJECTX,它托管在 Heroku 上。为了存储生产配置和文件,我使用了不同的存储库PROJECTX-config。是否有可能:

  1. 克隆 PROJECTX 配置,
  2. 删除当前的配置文件,和
  3. 将配置文件符号链接到 PROJECTX 配置文件

请注意,这必须在 Heroku 上完成。我也知道 Heroku 可以选择使用环境变量来维护配置,但这不是我想要的。

谢谢!

4

1 回答 1

2

不,它不可能。

每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。在 dyno 的生命周期中,它的运行进程可以将文件系统用作临时暂存器,但是任何其他 dyno 中的进程都看不到写入的文件,并且在停止或重新启动 dyno 时,写入的任何文件都将被丢弃。例如,任何时候由于应用程序部署而更换测功机时都会发生这种情况,并且作为正常测功机管理的一部分,大约每天一次。
- 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 变量中的内容。您只需要将 API 密钥等秘密存储在 ENV 中。

其他非秘密配置,例如您对各种 gem 的设置,可以而且应该在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。

于 2017-09-10T18:11:46.813 回答