缘起
SAE 和其他的平台有些不同,不能在服务器上运行 Composer 来安装各种包,必须把源码都提交上去。一般的做法,可能是直接把源码的所有文件复制到目录中,添加到版本库。不过,这样就失去了与上游代码的同步的优势。还好 git 提供了另一个功能叫 subtree,不但提供了版本追踪的功能,让代码可以一直和上游同步,同时源码文件还能提交到当前的仓库中。
过程
首先,当然是要安装 git 的 subtree 命令。这个命令虽然随 git 一起安装了,但默认并没有启用。每个平台的安装方法有所不同,请自行搜索安装。
第二步,将 think 和 framework 添加到远程仓库:
1 git remote add -f think https://github.com/top-think/think 2 git remote add -f framework https://github.com/top-think/framework
这样,两个 repo 就加到本地,并且 fetch 下来了。下面创建一个空的项目,并用git 初始化。记得至少提交一次。
1 mkdir demo 2 cd demo 3 git init 4 touch README.md 5 git add . 6 git commit -am "First commit."
重点来了,用 subtree 将 repo 绑定到目录里。
git subtree add --prefix tp5 think master --squash git subtree add --prefix tp5/thinkphp framework master --squash
上面这是关键步骤。完成之后,基本的 ThinkPHP 5 框架就搞好了。不过,默认的 ThinkPHP 5 需要写入到本地文件,这在 SAE 上是不允许的。还好 ThinkPHP 团队提供了 SAE 的扩展:https://github.com/top-think/think-sae。这里略微的不够完美。默认的这个包是通过 composer 提供的,可我们这里不能使用 composer 来安装。在研究了一下 ThinkPHP 5 的 autoload 机制以后,我发现他提供了一个 PSR-4 的加载机制。所以需要把 SAE 扩展的 src 目录下三个 PHP 文件复制到 tp5/thinkphp/library/think/sae 下。这里 sae 这个目录是不存在的,需要自己创建。因为我没有深入阅读 ThinkPHP 5 的源码,所以没有找到怎么配置 PSR-4 的加载路径的方式。所以,只有这三个文件没法和上游同步。SAE 扩展需要一些配置,请参考扩展的首页。不过为了让ThinkPHP在非SAE环境中也能运行,需要对配置文件进行一些设置。首先是在 public/index.php 里定义一个常量来标识是不是在SAE环境中:
1 define("IN_SAE", defined("SAE_MYSQL_USER"));
然后在配置文件里,可以这样:
1 ‘log‘=>[ 2 ‘type‘ => IN_SAE ? ‘\think\sae\Log‘ : ‘File‘, 3 ]
类似这样,讲每个配置区分为本地配置和SAE环境配置。
然后,按照 SAE 的说明,将代码推送到 SAE 上就可以了。
更新上游代码:
git fetch think master git subtree pull --prefix tp5 think master --squash git fetch framework master git subtree pull --prefix tp5/thinkphp framekwork master --squash
如此,便可以愉快的在 SAE 上玩耍 ThinkPHP 5 了。