分享一个我们 80% 团队使用的 rails 模板,能够极速构建一个符合国情的 rails 5 项目,快速开发。
rails-template 是一个 rails 模板,使用方法很简单:
rails new myapp -m https://raw.github.com/80percent/rails-template/master/composer.rb
特点:快速,最新,最合国情。
注意:适合于 rails 中级以上开发者使用。
它是一个很固执的 rails 5 模板,不接受任何选项,直接帮你应用了目前 "最好" 的组件,应用以下技术栈:
对于一个 Rails 中级选手来说,新项目都需要调整 Rails 缺省配置的很多东西。Github 也有很多 rails-composer
项目,但支持 rails 5 与国内本土化的还没有一个。
我在 80% 团队管理几个项目后,意识到这些重复工作很多,把它们抽取出来,写成一个 rails template
. 还可以帮助到其他的团队快速构建新的基于 rails 5
的应用。
rails-template 固执地认为,简单大众轻量是选择组件的最重要标准。不提供选项,默认集成,但易于去除,是 rails-template 的特点。
所以 rails-template 选择了以下组件:
rails 5
不仅如此,我们还默认打开了 turbolinks5
与 action cable
, 充分利用 rails 5 的快的优势。
bootstrap 3
bootstrap3 依然是最流行的 UI 组件,成熟而灵活,值得集成。rails-template 将这一切都准备好了。
postgresql
不用多说,现在已经成了 rails 的标配了。rails-template 还处理好了 database.yml 的配置与发布。
carriewave & upyun
图片处理几乎是 rails 应用的标配,rails-template 帮你配置好了这一切,只需要将 application.yml 完善即可使用。
mina & plugins
mina
轻而快速,比 capstrano
更简单快速,适合小巧的项目,调整完 config/deploy/production.rb
后,一个 mina setup
即可准备好发布环境,十分方便。
slim & coffeescript & high_voltage & kaminari
使用最简洁有效的方式组织你的 rails 代码,是 rails-template 的目标
puma
puma 已经是 rails 5 的标配,不仅如此,我们还准备了更为合理的 puma.rb
配置,热布署十分简便即可实现。
rspec
rspec, factory_girl 几乎是目前的测试项目标配,我们直接将其配置好。而且会自动随着其版本而更新。
rails-template
是楼主几年 rails 经验总结,也是 80% 团队近期几个项目的实践成果,适合于有一定经验的 rails 工程师使用。能够让你快速创建一个漂亮的 rails 初始项目,尤其是在国内的项目,能够减少大量的重复劳动,自动应用很多最佳实践。
请访问 https://github.com/80percent/rails-template 开始你的 rails5 新项目之旅。
也欢迎你为 rails-template
添瓦,补充使用文档,使其成为国内构建 rails
应用的基石。
@hz_qiuyuanxin devise 跟 simple_form 不是很好的东西,社区里也有一些吐槽,在国内不是很需要。即使需要也非常容易整合。而移除比较麻烦。所以不集成在内。
#11 楼 @hz_qiuyuanxin devise
在国内用的不会很多,因为邮件登录不是首选,这种情况下带来的问题比解决的问题更多,所以不集成它。想添加的话是很容易的,去的时候反而麻烦点。
个人感觉,对于新手来说,也许很有帮助,对于老手来说,可能毫无帮助,但是无论对谁来说,思路是非常赞的,做项目的,每次新项目都重复一些东西,完全可以按照楼主的思路沉淀出适合自己的一个启动模板来,应该是很有帮助的,不过感觉还可以多一些东西,如果项目模式固定的话,比如针对 Bootstrap Admin 模板类型项目的话,还可以准备一些 Scaffold 模板
slim 模板的开发效率真的很高吗?
刚开始我也觉得 slim 的代码非常精干,严格的缩进排版能迫使程序员认真对待每一行 HTML 代码。不过在一个项目开发过程中,因为对 js.slim 中的 js 代码的混合写法实在搞不定,最终还是把所有代码都替换成了 erb 模板。
现在感觉还是 erb 要舒服很多,而且网上绝大多数样例都是 erb 的。
说下我的看法,devise 和 simple_form 依然需要 devise:@lyfi2003 你说的缺点固然有,但是用户系统对任何一个完整应用几乎是必备,除非你能找到一个更合适的替代,另外你说的国内用户较少,可能也未必吧,写代码的有几个不会翻墙,连这点信息都获取不到真不如改行. simple_form 这个大家已经说明 另外 slim 这个东西我真心不喜欢,通用性就是个大问题,唯一的好处就是熟悉之后你自己看着舒服而已,仅仅是你自己,当你整合其他代码的时候会导入一堆问题,而且这些问题还必须转成 slim 格式的文件你才能去 debug.除非哪一天它成为官方标配,否则,还是算了吧。等哪天你想 rollback 的时候,一堆 slim 文件要改,你会后悔无比。
明显是高的
这个见仁见智,我用 Rails 近十年,ERB,Slim 和 Haml 的项目都经历过不少。实话说,我个人完全不觉得另外两个在编码效率上有过人之处。到是维护升级和解决一些额外的小毛病上会浪费时间。
@lyfi2003 问下那个项目的权限管理你打算用什么 gem 啊,还有一个小建议,那个 gemfile 中的 gem 能不能加个备注啊,我觉得这样一般阅读比较好
我的感觉是这样的
#58 楼 @small_fish__ 加快编写速度可以用 Zen Coding;直接拿现成的 HTML 来改的情况还是非常多的:
关键的一点,这是一层而外转换,需要 team 去学习一种额外的语法。如果项目中的设计师和开发者人来人往,就是额外的开销。
#66 楼 @alvin2ye 对于配置文件,安全仅有一点:不要提交任何敏感信息到服务端。所以 rails-template
是添加了一个 config/application.yml.example
, 随后由开发者自行复制一份为 config/application.yml
, 而此文件在 git
中是忽略的。这是 rails-template
的集成方式。
在不同的生产环境,config/application.yml
由发布者在 mina setup
时自行配置即可。rails-template
在随后的发布过程自动软链接它,保证每次新的发布使用同一份配置。简明清晰的流程。
dotenv
建议开发者提交一些配置到 .env
, 和提交 .env.production
之类的,不是配置的最安全做法,只要你提交过敏感,一旦源代码泄漏,就有黑客能轻易攻击你。所以我说安全性会降低。我在上述的解决方式中是一种简明清楚的手段。这也是很多开源项目类似的手法,例如 ruby-china
.
相对来说,我会选择简明,安全的手法去集成。于是使用了 figaro
我明白你的意思了。
但这个和 dotenv 无关。我也不觉得作者的意思是让你提交敏感信息在 .env.production
中,你同样可以有个 .env.production.example. 这个和哪个 Gem 安全无关。
devise 和 simple_form 这两个东西,我个人不喜欢。 devise 因为复杂度,可能会带来问题,导致学习成本升高。 simple_form 的那些伎俩程序员完全可以用自己的方式自己实现下,写在 helpers 中。
#67 楼 @lyfi2003 dotenv 明明在首页清楚地写道:
Credentials should only be accessible on the machines that need access to them. Never commit sensitive information to a repository that is not needed by every development machine and server.
简单翻译
凭证应当遵循“谁访问,谁存储”的原则。永远不要将并非开发所需要的敏感信息提交到代码仓库中。
怎么在你口中就成了:
dotenv 建议开发者提交一些配置到 .env, 和提交 .env.production 之类的,不是配置的最安全做法,只要你提交过敏感,一旦源代码泄漏,就有黑客能轻易攻击你。所以我说安全性会降低。
我就是遵循 dotenv 的建议,将敏感信息存储在部署服务器上,将非敏感信息提交到代码库。你自己实践方式不对,却说作者建议你把.env.production 提交到仓库,这样不妥吧?
@lyfi2003 顺便问一下 minitest 是否还保留着,我现在更加喜欢 minitest 来写测试。基本上能用 Rails 自带的就不选其他的。之前也是 slim 的粉丝,让设计都学会了 slim,现在我还是用 erb 了。
nouse: 人之宝石,我之垃圾。
有大量的外包团队每天都在写重复的内容,这个模板可以减少很多工作量,节省大量的前期工作。对你没用,不发表评论就可以了,为什么要说 垃圾
呢。你总是通过惊世骇俗的观点来刷存在感吗?
动不动就说别人遇到的问题简单,一堆反问句质问别人,嘲笑别人的英语。
- 这不是常见面试题吗?最傻的办法得出结果以后循环一下都不会吗?
- 问题来了,为什么用 Ruby 做 ETL?
- @helperhaps "Jiguang Push"好典型的中国式英语
- 说 Rails 是理念的,这理念至少落后 5 年了
你技术实力也很硬,不如像 nightire 多分享一些内容,少一些吐槽。社区缺的是建设者,而不是评论家。
感谢楼主的分享,fork 后做了如下改动:
喜欢的拿走,不谢! 创建应用: rails new myapp -m https://raw.github.com/bingxie/rails-template/master/composer.rb
github 地址: https://github.com/bingxie/rails-template
使用 @lyfi2003 的脚本创建项目后,rails s 运行会出错。我使用的 vagrant,ubuntu 64 位 16.04,ruby 2.3.1,rails 5.0.0 应该是 minitest 的问题,我已经参考网上说的,在 Gemfile 中添加了 require 'minitest',在错误的 rb 文件中,添加了 require 'minitest/autorun'等等的方法,但是还是会出错。不知道问题在哪里。
/home/ubuntu/.rvm/gems/ruby-2.3.1/gems/activesupport-5.0.0/lib/active_support/test_case.rb:16:in <module:ActiveSupport>': uninitialized constant Minitest (NameError)
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/activesupport-5.0.0/lib/active_support/test_case.rb:15:in
'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/test_unit/railtie.rb:17:in block in <class:TestUnitRailtie>'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:30:in
instance_exec'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:30:in run'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:55:in
block in run_initializers'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:228:in block in tsort_each'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:350:in
block (2 levels) in each_strongly_connected_component'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:431:in each_strongly_connected_component_from'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:349:in
block in each_strongly_connected_component'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in each'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in
call'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:347:in each_strongly_connected_component'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:226:in
tsort_each'
from /home/ubuntu/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/tsort.rb:205:in tsort_each'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/initializable.rb:54:in
run_initializers'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/application.rb:352:in initialize!'
from /home/ubuntu/rails_project/test11/config/environment.rb:5:in
'
from /home/ubuntu/rails_project/test11/config.ru:3:in require_relative'
from /home/ubuntu/rails_project/test11/config.ru:3:in
block in
instance_eval'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:55:in
initialize'
from /home/ubuntu/rails_project/test11/config.ru:in new'
from /home/ubuntu/rails_project/test11/config.ru:in
'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:49:in eval'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:49:in
new_from_string'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/builder.rb:40:in parse_file'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:318:in
build_app_and_options_from_config'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:218:in app'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:59:in
app'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/rack-2.0.1/lib/rack/server.rb:353:in wrapped_app'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:124:in
log_to_stdout'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/server.rb:77:in start'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:90:in
block in server'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:in tap'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:85:in
server'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands/commands_tasks.rb:49:in run_command!'
from /home/ubuntu/.rvm/gems/ruby-2.3.1/gems/railties-5.0.0/lib/rails/commands.rb:18:in
'
from bin/rails:4:in require'
from bin/rails:4:in
'