首页 > 解决方案 > 如何在 Rails 5 环境中创建 Rails 6 应用程序

问题描述

我正在使用构建一堆模板代码的微服务自动化管道。

目前,管道代码通过guard自动运行并生成一个shell脚本来创建数据库、创建新的rails应用程序和其他类型的资产。

我在 RbEnv 中运行 ruby​​ & rails 并且我正在执行的脚本在命令行中运行良好,它创建了一个全新的 Rails 6 应用程序。

但是,当我从具有现有 Rails 5.2 环境应用程序的守卫运行它时,新应用程序将构建为 Rails 5.2 应用程序。

我已经尝试覆盖某些设置,但它仍然会选择我的代码运行的环境。

当我从命令行运行脚本时:

echo 'SHOULD CREATE A RAILS APP using VERSION 6.0.0 on RUBY 2.6.3'

gem install rails -v 6.0.0

echo 'rails -v'
rails -v

echo 'rbenv local'
rbenv local

echo 'rbenv version'
rbenv version

echo 'rbenv versions'
rbenv versions

rails _6.0.0_ new . -d postgresql --force --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-spring --skip-test --skip-bundle --skip-webpack-install

我得到以下输出日志

Successfully installed rails-6.0.0
1 gem installed
SHOULD CREATE A RAILS APP using VERSION 6.0.0 on RUBY 2.6.3
rails -v
Rails 6.0.0
rbenv local
2.6.3
rbenv version
2.6.3 (set by /Users/myname/dev/myapp/.ruby-version)
rbenv versions
  system
  2.4.1
  2.4.6
  2.5.3
* 2.6.3 (set by /Users/myname/dev/myapp/.ruby-version)

使用以下 GEM 文件

ruby '2.6.3'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.0'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server

并通过最后一行确认应用程序是 Rails 6

remove  config/initializers/new_framework_defaults_6_0.rb

在此处输入图像描述

当我使用系统和 fork { exec { } } 上的变体从 ruby​​ 运行相同的脚本时

    Dir.chdir File.dirname(output_file) do
      # fork { exec("bash #{output_file}") }
      system "bash #{output_file}"
      # system "/usr/local/bin/zsh #{output_file}"
    end

我得到 Rails 5.2

rails -v
Rails 5.2.3
rbenv local
rbenv: no local version configured for this directory
rbenv version
2.5.3 (set by RBENV_VERSION environment variable)
rbenv versions
  system
  2.4.1
  2.4.6
* 2.5.3 (set by RBENV_VERSION environment variable)
  2.6.3

在此处输入图像描述

标签: ruby-on-railsrubyshellruby-on-rails-6

解决方案


我真的不明白您为什么要在 ruby​​ 中执行此操作,似乎您正在尝试重新发明诸如 docker 或 kubernetes 已经很好地解决的问题。

但我怀疑你的脚本的问题是 bash 会话没有你想要的 rbenv 存根。我会在您的计算机或服务器的文件系统上找到它们的位置,然后在运行诸如gemrailsbundler.


推荐阅读