分享 Campo 3 发布

Rei · 2014年03月06日 · 最后由 runup 回复于 2014年05月12日 · 16397 次阅读
本帖已被管理员设置为精华贴

熟悉我的人应该知道我以前就写了一个论坛 http://codecampo.com/ ,它已经在线三年,是我维护最久的项目。这两个月我又将它推倒重写了一次,理由写在这里:关于 Campo 3

项目地址是:https://github.com/chloerei/campo

然后是针对 Ruby China 社区补充点内容。

一直有人问有没有一个不太复杂又不太简单、代码风格好、没有奇技淫巧,适合新手阅读的 Rails 项目,那么我建议看看 Campo 3。我认为即使是同样的逻辑,代码也要写三遍才会算得上好,Campo 版本刚刚到达 3,所以我觉得可以给人看了。当然如果觉得代码有写得烂的地方,欢迎发 Pull Request,一起讨论怎样写代码更好。

这个项目的技术选型一个大前提是跟随 Basecamp 的方案,因为它代表了以后 Rails 发展的方向,也便于降低维护难度。所以跟我之前两个项目不同,这次用了 ActiveRecord 搭配 Postgresql 数据库,而不是 MongoDB。

Template 依然用的是我喜爱的 Slim。在项目初期我曾经想为了降低加入门槛用 html.erb,但在写了几个页面之后,我还是难以承受编写 HTML 标签的繁琐(试过 emmet),已经到了无法工作的程度,所以还是决定用 Slim。这可能是最不 Basecamp style 的地方,我希望用不惯的人也原谅我一点私心。

另外我花了很多时间去写开发环境搭建的脚本还有部署脚本,如果你熟悉 vagrant,那么在 clone 代码后可以用一条命令搭建开发环境:

vagrant up dev

然后 vagrant 会自动安装依赖、执行 bundle、创建数据库、初始化配置,安装的东西比较多,取决于网速可能会花很多时间,这时候可以泡杯茶看看书 🍵 。如果你不熟悉 vagrant,简单地说它是一个利用虚拟机搭建开发环境的工具,这样无论用什么 OS 都可以获得一样的开发环境。

最后想说 codecampo.com 的运营方向,我打算让它成为 Campo 项目的支持论坛,其他的帖子我还是发在 Ruby China,所以不会冲突,我一个人也无法运营一个社区。

希望这个项目能帮助一部分人节省时间,以上 :metal:

秀一下代码量,越少越好。

$ rake stats
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |   713 |   585 |      28 |     104 |   3 |     3 |
| Helpers              |   127 |   108 |       1 |      13 |  13 |     6 |
| Models               |   305 |   247 |       8 |      31 |   3 |     5 |
| Mailers              |    22 |    19 |       2 |       2 |   1 |     7 |
| Javascripts          |   148 |   108 |       0 |      20 |   0 |     3 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Controller tests     |   749 |   607 |      25 |      12 |   0 |    48 |
| Helper tests         |    52 |    43 |       8 |       0 |   0 |     0 |
| Model tests          |   194 |   152 |       8 |       0 |   0 |     0 |
| Mailer tests         |    11 |     5 |       2 |       0 |   0 |     0 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |  2321 |  1874 |      82 |     182 |   2 |     8 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 1067     Test LOC: 807     Code to Test Ratio: 1:0.8

不错,顶你

赞,代码量的确少,我自己的烂项目尽然 controller 要 1500 多行。

不错 支持啊

考不考虑用 SASS,又可以省掉好多行数和字节 {};

#6 楼 @swordray 我觉得 css 不太一样,普通的一块声明就是几行到十几行,一个 css 文件会很长,去掉 { } 会看不清层次。

#8 楼 @Rei 卧槽………我这才知道 sass 和 scss 居然是俩东西………实在是太丢人了………一直以为 sass 语言写出来就是 scss………

BTW 一直很喜欢 Rei 的东西给顶一个!点赞!

#8 楼 @Rei 我们团队从 SCSS 转向 SASS,感觉节省了写符号的时间,一屏显示的内容也多了,仅供参考

赞一个,终于用回 postgres 而不是 MongoDB 那一套了。

赞!刚才浏览了下,很适合新手阅读。

另外,有个问题:为什么依然使用 before_filter 而不是 before_action 呢?

#13 楼 @ichord 都是一个意思,也是处女座? #13 楼 @ichord

@swordray 这得问 DHH 为什么要把好好的 before_filter 换成 before_action .

@Rei 论坛能否作为其它应用的子模块

#15 楼 @ichord 含义更明确,filter 含义太广了

@Rei 赞 另外,有个疑惑,是出于什么考虑自己写了一个用户模块,而不是用 devise?用 devise 的话,其他应用集成或者做扩展会省力很多,而且代码量会少很多。

#18 楼 @quakewang devise 的源码我一直读不懂,对于用户模块这种定制需求比较多的功能读不懂源码让我觉得没有把握。

自己写用户登陆代码也不多,可以在项目里直接看到,要改起来很方便。

#13 楼 @ichord #14 楼 @swordray 跟着 Rails 走,之前就想过全部替换的了,还没空看 before_action 行为有没有什么变化。

slim 的学习成本要远远小于 MongoDB 的学习成本,关系型数据库还是主流数据库

赞啊 马上去读一遍~

虽然作者 @Rei 也是管理员,但是既然他没有给这个帖子加精,但是我觉得这个帖子必须加,所以由我来代劳吧!

LOL... Campo 赶在 Discourse 前打到 v3 版本。。。

http://blog.discourse.org/2014/01/the-road-to-discourse-1-0-2/

集成 vagrant 的部署脚本非常赞,目前还没看,不知道是 shell 还是 chef 来搞?

#25 楼 @lgn21st 纳尼?!原来管理员不能加精的吗?

#28 楼 @Rei 管理员没有给自己的帖子加精,所以只能由其他管理员代劳啦 ^_^

#27 楼 @clc3123 开发环境的脚本是 shell,才 33 行,用 chef 来写可能要 33 个文件了。

部署脚本是用 Cap。

#30 楼 @Rei 把 Cap 换成 mina 吧,把简单的事情做的直截了当。

#31 楼 @lgn21st 之前想用 mina 的,发现半年没更新了。cap 不但更新了大版本,还上线了文档网站,所以就用 cap 了。

#32 楼 @Rei 懂了,通过项目背后团队的态度判断项目的靠谱程度,这个方法赞,符合 Campo 的精神!

赞,真不错。 Rei 的项目是我的启蒙项目,受益良多。

作为独立开发者,如何保证收入、生计?

目前也想搞个论坛类的东西,感谢楼主,果断阅读之

#36 楼 @newbie 我正在啃老

#16 楼 @swordray 现在不能。之前看过一个可以作为 engine 的论坛(忘了名字),集成方法是 mount 到路由,再指定一下 User mode。还没研究清楚技术细节,也许会试试。

#39 楼 @Rei 那个 engine 叫 forem, 我前几天试过。。。感觉还不如自己写。

赞啊,执行力超强,精力无限!的确,每次做东西连基础的一些模块都来一遍着实没有必要。

#38 楼 @Rei 所以可以做自己喜欢的事情,有意义的事情,实现理想。你做得很极致,总体要给赞。

#40 楼 @hardywu 我刚才考虑了一下要怎么拆作 engine:

  • User 移到外面
  • Notification 移到外面

Engine 包括的内容:

  • Topic/Comment/Markdown

如果主站已经存在了,加个 Topic/Comment 是轻而易举的事,不如自己写。

不过如果可以脱离主站独立更新维护……这很有吸引力。

#42 楼 @newbie 未来也需要自力更生的,期待我下一个项目。

it was twitterd

#43 楼 @Rei 建议论坛用户有多种选择

  • 独立注册用户系统
  • 为主站提供代码接口
  • 使用 主站 / 第三方 的 OAuth / LDAP

#46 楼 @swordray 现在相当于提供了第一种,第二种不如第三种,第三种情况比较多,各自开发比较好。

:plus1: 那就 perfect 了,我的网站第一个接入

#43 楼 @Rei 我也是考虑到减少维护难度,才想试着用 forem. 我目前的一个开源 MOOC 项目里,需要每个课程拥有自己的一个内部论坛,调试下结果发现 engine 的 routing 是个麻烦,而且花时间研究还不如自己写个简易的。

#48 楼 @swordray 为免误会描述一下:Campo 独立部署一个服务器,有自己的用户系统,不跟主站共享数据。是需要这样的吗?是的话就是这样。

#49 楼 @hardywu 每个课程都有内部论坛,这个定制度很高,自己开发更好。

#51 楼 @Rei 是啊。或者类似 devise 这样的 gem 会更好。

#52 楼 @hardywu 或者每个课程加个 disqus?

#50 楼 @Rei 我回复的是 #43 楼 engine 的话题,需要作为一个模块嵌入主站,并使用主站的用户系统,不是独立应用

#53 楼 @Rei 用 disqus, authentication 没问题么?我目前倾向于先写个简易版将就着用。

我记得 forem 的作者是 rails3 in action 的作者之一,那本书里有一章专门讲 forem 开发。

Um..... 題外話,為什麼不了當一點用 Ruby China Forum?

@Rei 有沒有考慮把 Campo3 作為 Agile web development with rails 5th 的原料寫一本書呢?

#57 楼 @ksec Ruby China 的功能是满足 ruby-china.org 为主的,改起来有点费劲。

#58 楼 @Juanito 我写不了啊,有人能翻译最新版就好了。

看了之后有个大收获:原来支付宝有个那么方便好用的收款页面!快速搭建开发环境那一块也很赞。

#9 楼 @cassiuschen 貌似它俩确实是同一种技术的两种语法。下面是我做的笔记:

SCSS 语法是 CSS 的超集 (兼容所有的 css 代码), 是比较新的比较推荐的格式。SASS 语法是旧的格式,它采用了类似 python 的缩进语法 (那么跟 css 就不兼容了). 所以我要是学习的话就学 SCSS 语法就行了。 但是 SASS 不光是一种语法,它是这种技术的称呼。所以即使你用的是 SCSS 的语法,你实现出来的还是 SASS 这种东西。(听起来有点拗口,其实关键在于 SASS 不光是一种缩进语法,它也是这个技术的称呼)

#58 楼 @Juanito 我也支持这种想法。现在看的那些书,最后写出来的东西就是个玩具,根本不能上线,作者老是担心读者水平不够,这个也省略,那个也省略。比如说,ruby on rails tutorial 部署还用 heroku,他是爽了,一下就把代码放到线上了,但学生就惨了,被卖了个广告,最后还要找教材部署到 VPS。

如果 @Rei 能用实际需求和实际项目教新手一步一步做出个能用的网站,这才是最好的教材。

#38 楼 @Rei 可以啃老也是件幸福的事情。暂时不用担心钱的问题,专心做自己感兴趣的事情。

👍 我就拿这个项目好好学学好了

还是不明白 vagrant 对开发有什么帮助。。我电脑里装了很多个版本的 gem,也没有冲突什么的。为什么要分离出来?

@Rei 为什么不用 mongo,又转回 postgre 了? 关于 devise,devise 是基于 warden 的,要读懂 devise 之前先要读懂 warden,或者我什么时候写点文章好了。

#66 楼 @cqpx 不用写多个平台的安装依赖脚本。

#67 楼 @femto 三大理由:

  1. 想换换口味
  2. 喜欢数字 ID
  3. 需要事务

#62 楼 @tylerlong 谢谢……主要可能写纯 sass 的毕竟比较少,所以我学 sass 的时候范例就是 scss……

太感谢,又可以研读一阵子了,给无聊的 java 开发工作注入新的活力@Rei

#54 楼 @Rei 考不考虑这个 feature?

#72 楼 @swordray 现在不考虑,工作量很大。

#73 楼 @Rei 我可以帮手啊

#74 楼 @swordray 还有,提取出来部分的功能会很少,只有发帖/回帖部分,这样就不如自己写了。

#75 楼 @Rei 我建议成立一个开放项目社区,把 账号、论坛、微博、私信 等通用功能都做成 engine,谁想建站只要自由拼装就行了

#52 楼 @hardywu 其实我最开始的设想是那个论坛只需要最基本的发贴等云云就好……另外因为拥有统一身份认证,要是直接调用比如 discourse 的 api 做你觉得可行么……

#77 楼 @cassiuschen discourse 我也看过了,感觉必须写成 plugin。又是大量的 doc 要看。

#76 楼 @swordray 这样跟我初衷不同了,我希望要定制的时候可以简单直接修改代码,而不是覆盖 hook 方法,devise 我就一直用不来。所以不会走这个方向。

#80 楼 @Rei 拼装方法是改代码、hook 还是传参数,这好商量。开放项目社区的方向觉得怎么样?

#81 楼 @swordray 我接下来要搞别的项目……

#82 楼 @Rei 那我先试试了,感兴趣的话随时欢迎

果断 fork 了。

@Rei 你在哪里?希望能当面向你请教。

var aaa=1;
alert(1);

##a

@swordray 你要做的與 @Rei 的初衷不一致。

#89 楼 @lepture 没关系啊,Twitter 的初衷也只是做视频而已

尝试部署一下,出错了

Running ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile on xxx.xxx.xxx.xxx
Command: cd /var/www/campo/releases/20140312144829 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.0.0-p247 RAILS_ENV=production ~/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
rake aborted!
DEBUG [dee9ec58]    undefined method `[]' for false:FalseClass
DEBUG [dee9ec58]    /var/www/campo/releases/20140312144829/config/initializers/00_config.rb:2:in `<top (required)>'

#91 楼 @jun1st 应该是没有放 config/config.yml 文件。

#91 楼 @jun1st cap production deploy:upload_config 会初始化配置文件。

#92 楼 @Rei 倒是放了,不过有错,hoho

一年多前就是通过 campo 学习 rails 的

大赞@Rei 哥,么么哒

太赞了,设计的好简洁, 无 tag 无话题分类

#75 楼 @Rei http://codecampo.com 是搭建在哪个 vps 的哪个机房啊,速度好快!

#99 楼 @google digitalocean sfo1

#11 楼 @Los 同感,终于是 ActiveRecord 搭配 Postgresql 数据库了,

@Rei 有一些 gem 我没用过,所以用你的代码 new 了一个项目,试试这些 gem, 在 bootstrap 这个 gem,但是一直报错没变量 Undefined variable: "$gray-lighter". 我的 application.css.scss

/*
 *= require font-awesome
*/


$font-size-base: 15px;

@import "bootstrap";
@import "campo";

body {
  background: #eee;
}

.text-hide-overflow {
  overflow: hidden;
  text-overflow: ellipsis;
}

Gemfile

# Bootstrap
gem 'bootstrap-sass', '~> 3.1.1'

# Font Awesome
gem 'font-awesome-sass', '~> 4.0.2'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.1'

#102 楼 @stephen $gray-lighter 是定义在 bootstrap 的变量,有可能 rails 只单独编译了 campo.scss,所以会缺少这个变量。你试一下将 campo.scss 改成符合 sass 标准的 _campo.scss,这样 rails 就会将他视为局部模板而不会编译他了。

BTW,我这里和你一样,但没有出现这个问题。

Campo 的文档网站在哪里?我很想学习这个项目,请教前辈

#104 楼 @runup 没有太多程序文档,只有安装部署相关的文档 https://github.com/chloerei/campo/wiki

而且安装过程我正在简化成一个 shell 脚本,wiki 近期会过时。

看了下,微论坛的风格,算是简化版的 RubyChina 啊!

太棒了,不会部署 RUBY-CHINA 只会装 codecampo,而且还是 POSTGRESQL,谢谢 REI

现在才看到,赞哦。

#111 楼 @mnqiangu ??这是啥意思?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号