李玮 · 更新于 2018-11-28 11:00:42

1.2 Rails 文件简介

概要:

本课时介绍 Rails 项目创建后的文件含义,介绍Rails 项目中的三种运行环境, Gemfile 及 Gem,以及 Rake 任务等。

知识点:

  1. 文件含义
  2. 运行环境说明及配置
  3. Gem 和 Gemfile
  4. Rake 任务

正文

1.2.1 基础文件介绍

本节开始前,我们先使用一个命令,创建 Rails 项目。或许你已经知道了,它就是:

rails new shop

提示:如果你已经安装了其他版本的 Rails,那么该命令使用最新的版本创建项目,如果指定其他版本,可以这样来写

rails _4.1.5_ new shop

如果你想查看已经安装的 Rails 有哪些版本,可以使用 gem list | grep rails

好了,我们来看一下 new 为我们创建了哪些文件。

app 文件夹

我们的业务逻辑文件存放地,在后面的教程里,我们会经常为它增加内容,到时会详加介绍。

config 文件夹

这里存放的是 Rails 的配置文件。首先,打开 environments 文件夹,我们可以看到三个文件,这分别对应 Rails 的三种运行环境,我们开始时候使用的是 development 环境,运行测试时是 test 环境,当我们把代码部署到服务器上,正式上线的时候,使用的是 production 环境。

Rails 允许我们分别为三种环境做不同的设置,比如,production 中 config.assets.digest = true,而开发环境可以设为 config.assets.digest = false

Rails 还为我们提供了 I18n 的管理功能,这里还只有 en.yml 一种语言包,后面的课程里,我们将详细介绍 I18n 功能,并添加简体中文和英文语言包。

database.yml 中配置了数据库信息。Rails 默认使用 sqlite 数据库作为开发使用。我们也可以更改它,在 new 的时候这样做:rails new shop -d mysql|oracle|postgresql|...

routes.rb 是我们的路由文件,一个非常重要的文件,我们下一个章节将从它开始介绍 Rails 的诸多优秀设计。

secrets.yml 中的配置分别对应三种运行环境,它是用来加密我们的 session 的。

db 文件夹

如果你使用的是 sqlite 数据库,那么你会发现它存放在这里。sqlite 是一种小型的便于开发环境使用的数据库。在生产环境(production)的数据库,比如 mysql,postgres 等数据库文件,是不需要放到这里的。

migrate 文件夹中,存放的是我们的数据库迁移文件,下一章我们会经常看到它。

这里还有一个 seeds.rb 文件,可以用它来为项目创建一些初始数据。

lib 文件夹

lib,在我们开发 Rails 项目是,会经常的扩展一些功能,而这些功能具有复用的特点时,可以把代码放到 lib 中。

这里我想到了 Rails 的一条哲理:Convention Over Configuration,约定优于配置。我们扩展的功能文件,可以放到任何可被夹在的目录下,但是,那违背了 Rails 的这条哲理。

log 文件夹

这里存放的是日志文件,我们可以看到它对应了上面的三种运行环境,Rails 把每一种运行环境的 log,都单独的存放。

public 文件夹

这里存放的是静态文件,比如图片,html,还有编译好的 js,css 等。

test

这里是测试文件,我们编写项目的同时,也会带领大家编写对应的测试代码。所以我们后面会经常的用到它。

不过,我们使用 Rspec 进行测试,测试文件放到 spec 文件夹里。

vendor 文件夹

这是第三方代码库,比如我们 clone 下来的 gem,下载的 js 库等。

Gemfile 文件

在之前的讲解中,我们经常提到 Gem。

Gem,是 Ruby 编写的代码库的发布包。一个 Gem 中还可以包含了其他一些 Gem,比如,Rails 就是个 Gem,其中还包含了 activerecord,activesupport 这些 Gem。可以说,Rails 就是一大堆 Gem 的集合。

Rails 是通过 Gemfile 文件,来管理众多 Gem 的。

打开 Gemfile,可以看到我们的项目使用了 Rails 4.2.0 这个版本的 Gem,使用了 sqlite3 这个数据库,以及其他的一些 Gem,这都是 Rails 4.2.0 默认使用的。

我们是可以修改这个文件,每次修改之后,我们需要 bundle install,它会把 Gem 的版本号和互相间的依赖关系重新的配置一遍,并且会自动的更新 Gemfile.lock 这个文件,然后安装 Gefile.lock 中声明的 Gem。

所以,即便我们使用不同的开发机器,只要 Gemfile.lock 相同,我们就会安装相同的 Gem,以保持每个开发机器使用相同的开发和运行环境。

Rakefile

Rails 为我们提供了很多便捷的 rake 任务,我们通过 rake -T 可以看到,如果加上 rake -T -D,可以看到详细的说明。当然,我们页可以自己编写 rake,把它们放到 lib/tasks/里面,扩展名是 .rake。

README.md 文件

为你的项目写一份 Readme 是很有帮助的,你有注意到.md 这个格式么?它是 markdown 格式,目前最流行的书写格式,本书也是用 markdown 写成的。

英文 介绍在这里,不过我更愿意看这里

我创建的代码,可以在这里找到:https://github.com/liwei78/rails-practice-code/tree/master/chapter_1/shop

1.2.2 安装 Gem

安装 Gem 时,Ruby(注意,是 Ruby)使用的是 bundler 这个工具。它的官网在这里:http://bundler.io/

在我们配置 Gemfile 时,经常遇到一些配置语法,这里把常见的介绍下:

source 'https://rubygems.org'
# source 'http://ruby.taobao.org' # 我们也可以使用 taobao 这个安装源,不过一些 Gem 不存在时,还是要使用 rubygems 官方源的。
gem 'xxx', '~>2.0.3' # ~> 这个写法表示当前版本大于等于2.0.3,小于2.1版本
gem 'xxx', '~>2.1'   # ~> 这个写法表示当前版本大于等于2.1,小于3.0版本
gem 'my_gem', '1.0', :source => 'https://gems.example.com' # 我们可以指定自己的 source 源
gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git', :branch => '1.4' # 也可以指定 Github 地址和分支
gem 'extracted_library', :path => './vendor/extracted_library' # 我们可以从 vendor 文件夹中安装一个 Gem。
# 我们可以为运行环境指定一个 group,比如,在 development 和 production 环境中,将不加载 rspec 这个 Gem,它只需要在 test 环境下工作。
group :test do
  gem 'rspec'
end

翻看 http://bundler.io/gemfile.html,查看更多 Gemfile 的介绍。

1.2.3 运行 Rake 任务

Rake 是一个 Ruby 实现的类似 make 的工具程序。任务(Tasks)是由 Ruby 代码编写的。这么讲有些抽象,我们看看 Rails 为我们提供的几个 Rake 任务:

rake db:create   # 创建数据库
rake db:migrate  # 更新数据库,更新的文件来自 db/migrate/
rake db:seed     # 执行 seed.rb 文件的内容,通常是创建一个默认的数据。
rake db:drop     # 删除数据库

上面这些命令,是在 development 环境下执行的,如果要在 production 下执行呢?

RAILS_ENV=production rake db:migrate

另一个常用的,是

rake routes

它会列出我们所有定义的路由(routes)列表。

你也可以自己编写一个 Rake 任务,放到 lib/tasks/中,扩展名为 .rake。