loadsys//skeleton

Loadsys CakePHP 3.x 应用程序骨架

3.3.1 2015-10-20 19:37 UTC

README

为使用 CakePHP 3.x 创建应用程序的骨架。(如果您正在寻找 2.x 兼容版本,请查看 cake-2.x 分支。)

此骨架针对 Loadsys 的最常见需求进行了优化。如果您自己找到这个骨架,它可能比您需要的更多或正好符合您的需求。您可以自由选择任何有用的想法。

❕ 这是骨架的 README!要编辑新项目捆绑的 README,请参阅 README.md.template

使用骨架的要求

要在开发机器上使用骨架创建新项目,以下工具必须安装

  • composer(所有说明假定您可以通过 composer 全局访问它。)
  • git

请参阅 README.md.template 以获取使用此骨架创建项目所需的系统要求。

骨架使用方法

骨架的 3.x 版本利用了 composer 的 create-project 命令。将使用此存储库作为基础为您创建一个新项目。在过程中将执行安装后脚本以适当地转换克隆的文件。

$ composer self-update # Generally a good idea to run first.

$ composer create-project --prefer-dist --ignore-platform-reqs loadsys/skeleton local/path/for/new/project ~3.2

# (Answer wizard questions.)

$ cd local/path/for/new/project

$ ./bootstrap.sh vagrant

在 vagrant 配置完成之后,虚拟机将在 http://localhost:8080 上可用。

或者,您可以编辑系统中的 hosts 文件,以包含 config/provision.yaml 文件中列出的虚拟机的 IP 地址和主机名。完成后的机器的 web 服务器将对解析为该 IP 地址的任何域名做出响应。如果您使用 vagrant-hostmanager 插件,这将为您完成。

您应该能够访问新应用程序的主页并看到设置“交通灯”为绿色。

贡献

如果您想为此项目做出贡献,请针对正确的分支打开一个拉取请求;3.x 骨架针对 master 分支,2.x 骨架针对 cake-2.x 分支。

测试骨架可能很困难,因为在正常情况下,开发人员必须提交他们的实验性更改,将更改推送到 Github,将更改合并到 master 中(可选)并为 packagist.org 标记新版本以进行“发布”。由于在处理新且未测试的内容时这是一种糟糕的情况,因此能够运行使用本地检查出的骨架存储库的 create-project 命令将非常不错。

为了实现这一点,需要“欺骗” composer 使用本地副本,这需要精心制作的 packages.json 文件。为了简化此过程,骨架中包含了一个 skel/test-project.sh [branch-name] [dest/dir] 脚本。

因此,要测试对骨架的更改

  • 克隆骨架存储库。
  • 检出新的主题分支。
  • 进行更改并提交它们。(此方法的一个局限性是更改必须可以从 git 索引中获取。)
  • 运行此命令: ./skel/test-project.sh my-branch-name /new/app/dir
  • 新项目将在 /new/app/dir 中设置,并且可以根据需要进行测试。

SemVer

因为这个仓库通过Packagist使用,所以它维护语义版本。在cake-2.x分支上的2.*系列可以用来使用旧的skelbin/spawn方法创建新项目。3.*系列跟踪master,并打算与composer create-project一起使用。你应该始终使用版本指定符与create-project命令一起使用,以确保你使用的是这个骨架的完全稳定的版本。原始的master分支可能包含已合并但“未发布”的新功能,这些功能可能不稳定或尚未准备好在全新的项目中使用。

模板

作为create-project过程的一部分,将执行一个composer后安装脚本,该脚本会扫描新项目中的*.template文件,然后在它们内部扫描{{TOKEN}}。然后提示运行create-project命令的开发者输入每个令牌的值,并将这些值写入重命名的文件。

例如,如果README.md.template包含一个{{GIT_CLONE_URL}}令牌,开发者在设置期间将被提示输入一个值,例如git@github.com:myself/super-project.git该值将写回README.md.template,并替换任何现有的README.md文件。

换句话说:这个仓库使用README.md和composer.json,但你的生成的项目将使用填写后的README.md.template和composer.json.template的副本。所以如果你想更改新项目中默认的composer包,你需要编辑composer.json.template

当在骨架的模板上工作时,查看当前正在使用的令牌列表可能会有所帮助。这可以通过在命令行中使用grep很容易地完成。

  • grep -norE --include "*.template" '{{([A-Z0-9_]+):?([^}]*)?}}' . - 列出所有令牌及其默认值,包括文件和行号,但可能包括文件之间的重复项。这有助于查看在哪里使用。

  • grep -horE --include "*.template" '{{([A-Z0-9_]+):?([^}]*)?}}' . | sort | uniq - 列出所有令牌及其默认值,无重复项,无文件或行号。这有助于审查“简化”的令牌和默认值列表,以查看是否可以进一步合并。

后安装脚本

create-project命令背后的大部分魔法在于composer能够在新项目中执行PHP脚本。这些脚本通常位于skel/src/中,并连接到composer.json:scripts:post-create-project-cmd数组。在设置期间执行的任务包括

  • 在所有*.template文件中替换{{TOKEN}},并将文件重命名为不带.template.的文件,包括config/app.php.template
  • 将随机安全盐写入新的config/app.php
  • @TODO:如果可用,从Shell Scripts仓库运行bin/deps-install命令,以安装node、git子模块和/或PEAR依赖项。
  • @TODO:提示用户提交和推送项目。

应该将附加的首次设置添加为后安装脚本。如果某个过程应该可重复,请考虑将其作为loadsys/CakePHP-Shell-Scripts仓库的一部分,并通过后安装钩子调用该脚本。

运行测试

composer脚本有自己的单元测试。要执行它们,请运行

$ composer install
$ bin/phpunit --configuration skel/tests/phpunit.xml.dist
$ open tmp/coverage/skel/html/index.html

与CakePHP App保持同步

定期拉取cakephp/app更改是个好主意。你可以通过创建补丁并将其应用到骨架上来做这件事。你需要知道<previous-tag><desired-tag>(使用最新的cakephp/app发布)。

确定<previous-tag>运行,并找到app-update-之后的标签

git log -1 --oneline --grep="app-update"

生成补丁

cd path/to/cakephp/app
git fetch
git format-patch <previous-tag>..<desired-tag> --stdout > app.patch

将补丁应用到新的分支 f/app-update-<desired-tag> 中,并将其合并到 cakephp-app 分支。

cd path/to/loadsys/CakePHP-Skeleton
git fetch
cp path/to/cakephp/app/app.patch path/to/loadsys/CakePHP-Skeleton/
git checkout cakephp-app
git checkout -b f/app-update-<desired-tag>
git apply --stat app.patch
git apply --check app.patch
git am --ignore-whitespace --signoff < app.patch
git checkout cakephp-app
git tag -f cakephp-app-previous
git merge f/app-update-3.0.2 --no-ff
git push origin cakephp-app

接下来,可以将它重新建立在 origin/master 上,并解决任何冲突。

git rebase --onto origin/master cakephp-app-previous f/app-update-<desired-tag>
git push origin f/app-update-<desired-tag>

现在,创建一个 PR 并合并它。

捆绑配置

默认情况下,由这个骨架创建的 Cake 3 项目将是 环境感知的。这种配置方法允许 Cake 应用在多个环境中工作而无需太多麻烦,但 创建 这些环境的持续性问题仍然存在。

我们曾经使用 PuPHPet 来处理这个问题的 Vagrant 部分,但我们厌倦了在每个项目中包含成千上万的文件,而通常我们并不需要这些文件。同时,在 AWS 或专用的生产服务器上进行“裸机”安装时,也很难使用 PuPHPet 的资源,这进一步减少了其效用。

因此,我们用非常精简、轻量级的 shell 脚本替换了它。以下是它们的工作方式

“三台机器”

在我们的典型配置中,需要考虑三台不同的计算机。

  1. 开发者的工作站,通常是一台 Mac 笔记本电脑,它需要能够将代码推送到/从源代码控制(git)中提取,并运行开发工具,如代码编辑器、网页浏览器和项目的虚拟化托管环境副本(vagrant)。
  2. 开发者运行的项目副本,通常是 vagrant 虚拟机,它维护应用程序自身的托管环境,包括所有必要的资源(PHP、composer、Apache、MySQL、Memcached、文件存储)。
  3. 客户的运行副本(或多个副本)的应用程序,通常作为专用的物理服务器或云实例实现,它们也必须维护适当的托管环境,尽管可能分布在不同的资源上(EC2 网络实例 + ElastiCache 缓存 + RDS 数据库(s)+ S3 文件存储)。

为了节约开发资源并将这些环境尽可能统一,这个骨架捆绑了配置脚本,使设置过程可重复,并自动记录所需的步骤。此过程的执行顺序很重要,如下所述。

Provisioning Diagram

项目启动

当使用 composer create-project 首次创建新项目时,它将从开发者的“自然”环境(通常是 Mac OS X)执行。此步骤的要求是 gitphpcomposer。在此步骤中,该存储库中的文件将被复制到新的目录,并执行 composer install 以及任何 composer PostInstall 钩子脚本。

然而,新创建的目录尚未 完全 初始化,因此必要的步骤被编码到 bootstrap.sh 脚本中。此脚本通过调用 git init(如果需要)确保新的项目文件夹是一个 git 仓库,确保已执行 composer update,然后启动“配置”过程。对于开发者的 Mac,这意味着设置 vagrant 虚拟机,因此脚本调用 vagrant up,它本身在 VM 中执行 provision/main.sh vagrant 以准备它。

其他开发者

bootstrap.sh 脚本具有双重用途。如前所述,对于新创建的项目,它准备将一切提交到 git 并推送到新的远程服务器。

对于另一个新克隆现有项目的开发者(“第二次运行”),它为与项目一起工作准备环境,并再次运行 vagrant up 以初始化虚拟机。开发者只需在其机器上具备 gitphpcomposervagrant 作为先决条件。

部署

为了处理第三种机器情况,即“裸机”环境,git是唯一的前提条件,以便克隆仓库并运行bootstrap.sh。引导程序会为您启动provision/main.sh YOUR_APP_ENV_VALUE

结论

总的来说,这使我们能够

  • 重复使用bootstrap.sh脚本来
    • 完成首次运行的初始化新分支项目。
    • 处理开发者第二次运行的情况,并为项目虚拟机准备使用。
    • 处理第二次运行的情况,为新托管环境(如预发布和产品环境)准备,使机器能够直接托管应用程序。
  • 重复使用provision/*.sh脚本以安装和配置所有环境。

待办事项

  • 在项目中搜索@TODO标记。这应该会揭示任何必要的额外配置。