【问题标题】:Passing values from Capistrano deploy.rb file to app将 Capistrano deploy.rb 文件中的值传递给应用程序
【发布时间】:2023-12-19 09:54:01
【问题描述】:

在我的 Capistrano 的 deploy.rb 文件中,我设置了不同的环境,例如服务器名称、端口等。我还要求用户向另一台服务器发送回调,这也在 deploy.rb 中定义。如何干净利落地将此值传递给我的应用?

大意是这样的:

config/deploy.rb:

set :callback_url, "http://somecallbackurl.com:12345/bla"

app/controllers/myapp.rb:

def get_callback_url
   ???
end

我正在使用 Sinatra。

【问题讨论】:

    标签: ruby configuration sinatra capistrano


    【解决方案1】:

    我找到了解决办法,那就是使用环境变量。

    从 deploy.rb 设置它

    run "export CALLBACK_URL=#{callback_url}"
    

    来自应用程序:

    def get_callback_url
        ENV['CALLBACK_URL']
    end
    

    我不会说这是最干净的解决方案,但它确实有效。

    【讨论】:

      【解决方案2】:

      我可能会建议使用共享 YAML 文件来存储这种配置,并单独加载它。例如,有一个名为 config/settings.yml 的文件,其中包含以下内容:

      :callback_url: "http://somecallbackurl.com:12345/bla"
      

      config/deploy.rb 中,您可以:

      settings = YAML.load_file('config/settings.yml')
      set :callback_url, settings[:callback_url]
      

      config/initializers/settings.rb 中,您可以:

      settings = YAML.load_file('config/settings.yml')
      CALLBACK_URL = settings[:callback_url]
      

      最后,在app/controllers/myapp.rb,你会这样做:

      def get_callback_url
         CALLBACK_URL
      end
      

      使用共享 YAML 文件只是我想到的第一件事。另一种方法是在 ruby​​ 文件中定义一些常量,并在初始化程序和deploy.rb 中都要求该文件。基本思想是您并不真的希望您的应用依赖于您的 capistrano 环境,因此您应该找到一种方法来分离共享配置。

      【讨论】:

      • 嗯..如果我使用另一个文件会变得有点复杂。 callback_url 会在不同的环境中改变。生产环境可能会说 prod.callbackurl.com 而 dev/qa 环境指向其他地方。我正在使用 capistrano-ext 来管理不同的阶段。