【问题标题】:Capistrano: How to set global environment variable?Capistrano:如何设置全局环境变量?
【发布时间】:2011-12-12 03:28:20
【问题描述】:

我需要找到一种从 Capistrano 设置全局环境变量的方法。实际值是在运行时生成的,我无法在 repo 中检查它并从那里加载。

这个值必须在一个初始化器中加载为ENV['RAILS_ASSET_ID']

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails environment-variables capistrano


    【解决方案1】:

    作为一种解决方法,到目前为止我一直在使用这种方法:

    desc 'My custom task'
    task :task_foo do
      asset_version = 12345
      system "echo #{asset_version} > RAILS_ASSET_ID"
    end
    

    并在初始化程序中检索:

    File.open(Rails.root.join 'RAILS_ASSET_ID').read.strip]
    

    但必须有更好的方法。有什么想法吗?

    【讨论】:

    • 更好的方法:echo #{asset_version} >> #{current_path}/config/initializers/asset_version.rb
    • 为什么要一遍又一遍地追加到文件而不清除旧值?
    • 每个 cap deploy 都会创建一个新的 dir 结构,因此文件不应该在那里。 >> 是一种安全机制,以防开发人员有一天创建了该文件。
    【解决方案2】:

    在你的初始化器中指定它怎么样?

    ENV['RAILS_ASSET_ID'] = 12345
    

    【讨论】:

      【解决方案3】:

      如果你所说的全局变量是指在 Capistrano 中生成并随后在 Rails 中使用的东西,那么是的,你将不得不创建某种文件。 Ruby 变量在运行之间不会持续存在。环境变量可以设置,但只适用于子进程。

      在部署期间将文件转储到服务器上的一种方法就像您在服务器上所拥有的一样,只有远程:

      run "echo #{asset_version} > #{release_path}/config/asset_version.conf"
      

      您稍后可以在完成后拾取并读取该值。

      【讨论】:

        【解决方案4】:

        你不能使用default_environment capistrano 变量吗? cfgithub/capistrano

        例如,我们可以将它用于生产中的 rbenv :

        set :default_environment, {
        'PATH' => "$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
        }
        

        【讨论】:

        • 链接失效
        猜你喜欢
        • 2017-12-31
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 2018-11-03
        相关资源
        最近更新 更多