部署+配置文件+ Heroku

And*_*rew 11 ruby git configuration heroku ruby-on-rails-3

我正在使用Heroku来托管Rails应用程序,这意味着使用Git部署到Heroku.由于Heroku上的"纯Git工作流程",任何需要上游到服务器的东西都必须在我的本地盒子上进行相同的配置.

但是我需要让某些配置文件不同,具体取决于我是在本地设置还是部署在Heroku上.再次,由于Heroku使用的部署方法,我不能使用.gitignore和模板(正如我已经多次提到的那样,并且已经在其他项目中使用过).

我需要的是让git以某种方式跟踪文件的变化,但有选择地告诉git在从特定的repo中提取时不要覆盖某些文件 - 基本上只对单向进行某些更改.

可以这样做吗?我很感激任何建议!

jpw*_*ynn 16

您可以在每个heroku应用程序的本地设置中持久存储配置变量,这样它们就不必存在于您的代码中!所以相同的代码可以在多个heroku站点上运行,但具有不同的配置.它非常简单,轻松,优雅......

这是我们使用的方法.(我们用它来做同样的事情......我们在Heroku上有多个SAME应用程序的克隆,但是我们只想在github上有一个源代码,在我们的开发本地目录中我们执行PUSH到ORIGIN(github),然后当我们有它,我们喜欢的方式,我们光盘督促本地目录,都到相同的github存储库,而我们只PULL从GitHub到这个目录中,从来没有推(例如,所有推来GitHub的从我们的dev目录,督促目录只是其他heroku应用程序的临时区域.)

通过在不同的HEROKU站点上使用不同的配置(如下所述),EXACT SAME CODE在两个站点上运行.

所以我们的工作流程是:( 关键是BOTH目录指向SAME github repo)

cd myDEVdir
*....develop away....*
git add .
git commit -am "another day, another push"
git push origin  *(to our SINGLE github repo)*
git push heroku  *(test it out on heroku #1)*

cd ../myPRODdir
git pull         *(grabs SAME code as used on other site *)
git push heroku  *(now the SAME code runs on Heroku #2)*
Run Code Online (Sandbox Code Playgroud)

而已!

现在,您将如何在heroku站点上保留特定于站点的配置变量:

http://docs.heroku.com/config-vars

在本地命令行上,对于两个本地目录的EACH,执行以下操作:

$ heroku config:add FIRST_CONFIGVAR=fooheroku1
Adding config vars:
  FIRST_CONFIGVAR => fooheroku1

$ heroku config:add SECOND_CONFIGVAR=barheroku1
Adding config vars:
  SECOND_CONFIGVAR => barheroku1
Run Code Online (Sandbox Code Playgroud)

看看你定义的那些:

$ heroku config
FIRST_CONFIGVAR => fooheroku1
SECOND_CONFIGVAR => barheroku1
Run Code Online (Sandbox Code Playgroud)

然后cd到你的其他目录myPRODdir并执行相同的操作,只将相同的远程heroku变量设置为fooheroku2和barheroku2.

然后在你的rails应用程序中,您可以像这样简单地引用它们:

a = ENV['FIRST_CONFIGVAR']
Run Code Online (Sandbox Code Playgroud)

一个应用程序将读取'fooheroku1',其他应用程序将显示为'fooheroku2'

最后,在您的LOCAL目录myDEVdir上,在DEV模式下运行,在您的config/environment/development.rb文件中放置相同的配置命令,您的'dev'版本的配置变量将被设置为它们应该是什么:

ENV['FIRST_CONFIGVAR'] = "foodev"
ENV['SECOND_CONFIGVAR'] = "bardev"
Run Code Online (Sandbox Code Playgroud)

轻松,优雅.谢谢,Heroku!


jai*_*ime 5

以下是一些解决方案:

1)如果你只想在heroku上忽略文件,请使用slugignore

2)如果您的更改很小,请保持DRY并使用通用配置文件,插入用于特定于服务器的行为的开关

if Rails.env == "production"
    #production server code
elsif Rails.env == "development"
    #development server code
else
    #test server code
end
Run Code Online (Sandbox Code Playgroud)

3)如果您的更改很重要,请编写一个配置文件,并为每个其他服务器的config/initializers 添加"smudge文件".基本上,您将使用(2)中的技术使用单独的文件.

4)如果您的更改是SWEEPING(不太可能),则为每个服务器维护单独的分支.

5)这个脚本可以完全按照你的要求做,但可能有点过分.

我希望有所帮助.