config/environments/*.rb 文件和config/deploy/*.rb 文件之间是否存在依赖关系?如果是,它会影响 Capistrano 部署吗?

Is there any dependency between config/environments/*.rb files and config/deploy/*.rb files? If yes,does it impact Capistrano deploy?

我试图了解不同的配置文件是如何在幕后协同工作的。特别是与 environments/.rb 和 deploy/.rb 文件相关的配置。我知道 config/environments 目录是由 rails 创建的, config/deploy 是由 capistrano 创建的。我的理解是这两套配置有不同的用途。只是想澄清我的理解,如果这两组配置在 运行 应用程序与 rails 或部署应用程序时无论如何相互交互。 TIA.

environment/**.rb 包含应用程序在不同环境(测试、开发、生产)中运行时的设置。 deploy/**.rb 包含部署时(暂存、生产)应用程序的设置。

它们没有直接关系,但有相互作用。

如前所述,config/environment/*.rb 包含特定于环境的设置。这是在 Rails 引导时评估的。

config/deploy.rb 包含一般的 Capistrano 部署配置。通常,为某些部署情况创建一组特定配置很有用,在这种情况下,您可以在 config/deploy/*.rb 中定义文件。最常见的情况是针对不同的环境进行不同的部署。这是两者可以互动的地方。

例如,如果您有一个用于一组服务器的暂存环境和一个用于另一组服务器的生产环境,您可能会定义 config/deploy/staging.rbconfig/deploy/production.rb。这些将定义它们要去的服务器,并由 运行ning cap stagename deploy 触发,其中 stagenameconfig/deploy/*.rb 中的文件名(不带文件扩展名) .

config/deploy/*.rb文件中,还可以定义rails环境,在部署时Rails命令运行使用,如资产编译和Bundler安装。您可以通过添加行 set :rails_env, 'staging' 来完成此操作,其中 stagingconfig/environments/*.rb 中的文件名(同样,没有文件扩展名)。

然而,虽然在上面的示例中,两个文件之间存在 1:1 相关性,但并非总是如此。例如,如果您通过环境变量注入所有特定于环境的配置,您可能在 config/deploy/ 中有暂存和生产文件,但在 config/environments/ 中只有生产文件。在这种情况下,您可以将 Rails 运行 作为生产阶段。在这种情况下,您需要定义 set :rails_env, 'production',可能在 config/deploy.rb.

另一个警告是,如果您使用 capistrano-rails gem 并且没有在部署配置中明确定义 rails_env 设置,it will guess the Rails environment based on the stage name(名称部署时调用的文件,例如 cap stagename deploy)。所以你可能会误以为你需要在那里有一个 1:1 映射。但是,如果不需要另一个配置文件,只需显式定义 set :rails_env, 'stagename'.