Waterway 是使用 go 语言开发的全栈 Web 框架,受到 Ruby on Rails 框架的启发。
在开发 Waterway
之前,作者有 10 年以上 Rails 开发经验,对于 Rails 框架的优点和缺点,有比较深入的理解。
Rails 框架的优点之一,在于清晰固定的目录结构。这样的好处是,对于接触一个新的 Rails 项目,可以很快的上手。
Rails 框架的优点其二,在于【约定胜于配置】的设计思想,其默认的规则,往往就满足了开发需求,而不需要写大量的配置文件。
Rails 框架的缺点,有以下几点:
- 缺少业务逻辑层抽象,导致业务逻辑散落在控制器和 Model 之间。对于复杂的项目,你也许能看到几百行的 Model 定义。
- 不够模块化。
- 有些设计,属于黑魔法,对于第一次接触的人来说,有点难以掌握。
另外,由于 Rails 是基于 Ruby 语言开发的,其命令行工具,在生成框架代码时,运行速度非常慢(相比于 go 来说)。
所以,在吸取了 Rails 框架的优点,结合 Go 语言的特性,针对性的改进 Rails 框架的缺点,就这样,我开发出了 Waterway
。
提示:目前 waterway
还处于开发阶段,以下内容仅适用于当前的版本。如果有不完善的地方,或者好的点子和改进意见,欢迎提 issue。
我们使用gonew
工具,来创建新的 go 项目:
$ gonew github.com/daqing/waterway example.com/foo/bar
针对你的项目情况,替换 example.com/foo/bar
为真实的模块名称。
首先,项目使用 just 来执行一些脚本命令。
关于如何安装 just
请参考其中文文档:https://github.com/casey/just/blob/master/README.中文.md
除了 just, 项目还用到了以下软件:
-
air: github.com/cosmtrek/air 热重载 Go 应用的工具
-
overmind: github.com/DarthSim/overmind Process manager for Procfile-based applications and tmux
-
bun: https://bun.sh Bun is a fast JavaScript all-in-one toolkit
对于 macOS 系统,只需要执行:
$ just install-deps
就可以把上述依赖的软件安装好。
其次,项目使用了 .env
作为配置。
需要创建 .env
文件:
$ cp .env.example .env
这个文件,定义了几个环境变量,说明如下:
-
WATERWAY_PG_URL
-
连接PostgreSQL字符串,类似这样的形式:
-
postgres://daqing:passwd@127.0.0.1:5432/waterway
-
-
WATERWAY_PORT
- 服务器监听的端口,默认为
"2000"
- 服务器监听的端口,默认为
-
WATERWAY_STORAGE_DIR
-
存储用户上传文件的绝对路径
-
例如:
/var/www/storage
(不要以'/'结尾)
-
-
WATERWAY_ASSET_HOST
-
静态资源的托管域名(可用于配置CDN)
-
例如:
https://assets.example.com"
-
-
APP_PWD
-
项目所在的绝对路径(不要以'/'结尾)
-
例如:
/Users/joe/projects/waterway
-
替换掉 justfile
中硬编码的 waterway
字符。
例如,justfile
里面有这样的文字:
createdb:
psql -U $POSTGRES_USER -d postgres -c "create database waterway"
需要把 waterway,替换成当前项目所用的数据库名字。
创建数据库和表结构。
执行以下命令:
$ just createdb
$ just migrate
这样,数据库和表结构,就准备好了。
初始化 JavaScript 环境。
Waterway
通过集成 bun
工具,支持在页面中使用 React 代码库。
执行以下命令:
$ just bun
就可以准备好 React 环境。
修改 Dockerfile
,把里面的waterway
,替换为项目名称。
FROM alpine
WORKDIR /app
RUN mkdir /app/bin
RUN mkdir /app/core
RUN mkdir /app/public
COPY ./bin/waterway /app/bin
COPY ./bin/cli_amd /app/bin
COPY ./core /app/core
COPY ./public /app/public
ENV WATERWAY_ENV=production
ENV WATERWAY_PORT=2000
ENV APP_PWD=/app
ENV AW_ASSET_VERSION=1
ENV TZ="Asia/Shanghai"
EXPOSE 2000
CMD ["/app/bin/waterway"]
假设你的项目目录是 foobar-site
,那么,当执行 go build 时,所生成的二进制名称就是 foobar-site
。
那么,你需要把上面内容中的 waterway
,替换为 foobar-site
执行以下命令:
$ just
就可以启动本地开发服务器。
根据你的 .env
中配置的端口,就可以访问对应的网址。
假设你配置的端口是 2023, 那么,访问 http://localhost:2023 即可。