Discourse 定制教程#2 - 开始定制

开始讲技术了

Discourse 定制教程#2 - 开始定制

上一篇:Discourse 定制教程#1 - 基本介绍

本文目的

看完后对 Discourse 的代码有一定概念。
包括使用的技术,文件夹结构,用了什么数据库等等。

对读者的期望值

你是一名 Web 开发者,对一些基础概念都了解(起码简单的 HTML/CSS)。
不是完全的技术小白。
最好情况是 Ruby on Rails + Ember.js 开发者。

官方 Github

https://github.com/discourse/discourse

我们的整体计划

自己定制完了自己部署到服务器

Discourse 技术栈

特别注意

Discourse 开始于 2013 年,很多决定都是基于当时做的。
不能按现在 2018 年最新的 Ruby on Rails 5 + Ember.js 3.0 的思维套进去。

开发前强烈建议

  1. Discourse 官网仔细看一遍
  2. 官方 DEMO 仔细看一遍(支持哪些第三方登录,发帖界面等等都是怎样的)
  3. Github 上的 README 仔细看一遍

我的当前版本和环境

因为你很有可能是几个月甚至几年后读到这篇文章,那么很多东西都会变动。
把当前时间和版本列出来是很有帮助的

官方提供的定制指南

都是一些论坛帖子(会不断更新,每次看到好的就加进来):

  1. How to develop custom themes

步骤 0

先运行起 PostgreSQL 和 Redis 之后,再跑 Rails (Mac 上命令如下)

# PostgreSQL
pg_ctl -D /usr/local/var/postgres start

# Redis
redis-server &

# Discourse
rails s

步骤1

直接看官方指南:https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md
内容重点:

  1. 安装环境
  2. git clone 下来+一些必须操作(比如 bundle install 等)

(注:从后文开始我就假设你有一定 Ruby on Rails 和 Ember.js 基础了,
因为很多概念我没法在文章里介绍,比如我不可能直接在这里教你 Ruby on Rails ,这样文章就太长了)

步骤2

我现在把代码里一些重要概念都列出来:

  1. 使用了 ember-rails
    文件地址:discourse/Gemfile
gem 'ember-rails', '0.18.5'
  1. 根目录下一些以.(句号)开头的文件基本都可以忽略掉,没有特别重要的。
    都是一些第三方服务的配置文件,比如
    Code Climate (.codeclimate.yml)
    Travis-CI (.travis.yml)
    Transifex (.tx 文件夹)
    trasnfix
    34

  2. Discourse 的代码注释非常少
    (不管是 controller / model / view / javascript等等)
    Controller:
    controller
    Model:
    model
    View:
    view

我去官方论坛发了个帖子问『为什么注释这么少?』
"Why so little code comment in Discourse Codebase? (Github) "
有2个回答:
https://meta.discourse.org/t/why-so-little-code-comment-in-discourse-codebase-github/85710/6

Because comments tend to rot and deprecate which makes them useless (and sometimes counter intuitive) over time.

模块分析

(以下随意排序,并非按照先后或重要顺序排序)
(没有完全列全,会不断更新)
大致分了以下,有这些功能:

用户:注册登录
搜索:右上角
备份:后台点了按钮可以直接建,带文件/不带文件,得到一个 .sql.gz 文件可以下载下来
邮件:可以设置邮件模板
通知系统:轮询和表结构是咋样的?轮询间隔是可以后台控制的
设置:
API:还有 Webhook
标签
插件:没有简单的安装方式,要改代码
帖子:
评论:
点赞:
第三方登录:google yahoo twitter facebook instagram github SSO
小组:http://localhost:3000/admin/groups/custom
日志:http://localhost:3000/admin/logs/watched_words/action/block 
	   可以设置敏感词。特定词不允许发布,特定词会被替换,特定词需要审核
搜索log:可以看到用户搜索了什么,搜了多少次	
日志2:http://localhost:3000/logs
标记?flag,http://localhost:3000/admin/flags/active
  1. 用户系统没有用 devise(Gemfile 里没有)

  2. Google Tag Manager
    文件路径 discourse/app/views/common/_google_tag_manager_head.html.erb
    是帮助 Marketing 的,收集数据. 需要自己加 meta tag 等操作。

  3. &. 语法是什么?
    答案:
    https://ruby-china.org/topics/35195

  4. ||= 语法是什么?
    答案:
    https://stackoverflow.com/questions/995593/what-does-or-equals-mean-in-ruby

  5. Discourse 用了 Ember. 但是没有用 Ember Data.
    https://discuss.emberjs.com/t/why-discourse-is-not-using-ember-data/7169

  6. Discourse 里 Ruby on Rails 的 View 层很薄。
    discourse/app/views/
    因为用了 Ember, 所以绝大部分模板在 Ember 那边。
    (可以看到截图里, views/ 下的文件数量很少,每个文件夹1-4个文件,文件内代码也很少)
    thin-view

(待写)