totten/amp

CLI 接口到 *AMP-style 堆栈

0.8.0 2024-08-02 23:40 UTC

README

sudo curl -LsS https://download.civicrm.org/amp/amp.phar -o /usr/local/bin/amp
sudo chmod +x /usr/local/bin/amp

构建和测试

构建和测试过程基于 composerphpunitbox

为了便于在 Linux 和 macOS 上使用多个版本的 phpmysqld 进行本地开发和测试,该仓库包含一些辅助工具:default.nix./scripts/run-tests.sh./scripts/run-build.sh。这些辅助脚本需要 nix 包管理器。使用方法

## Get the code
git clone https://github.com/amp-cli/amp
cd amp

## Start a shell with php+composer
nix-shell

## Run the test suites
./scripts/run-tests.sh

## Run the build, creating "dist/amp.phar"
./scripts/run-build.sh

关于 amp:愿景

amp 是一个用于促进 PHP 网络应用程序开发的工具。目标是补充 composer(以及类似工具)通过添加一个(主要)自动化的步骤来设置新下载代码的数据库和 web 服务器。例如,检查项目的开发者可能会说

me@localhost:~/src$ composer create-project example/my-application --dev
me@localhost:~/src$ cd my-application
me@localhost:~/src/my-application$ ./bin/amp create --url=http://localhost:8003
URL: http://localhost:8003
Admin User: admin
Admin Password zFWx9D22

my-application 包依赖于 amp 包(使用 require-devsuggest)。amp create 步骤会在本地 mysqld 中创建一个新的数据库,在本地 httpd 中创建一个新的虚拟主机;然后它将必要的凭据(例如 mysql 用户名和密码)写入配置文件。

其他想法

  • amp 不是一个包含捆绑二进制的完整堆栈(对于 PHP、MySQL 等)。
  • amp 不是一个用于远程服务器的集群管理工具。
  • amp 不是一个一键安装程序。
  • amp 不是一个系统管理套件。
  • amp 主要是一个本地 *AMP 堆栈的接口——它旨在帮助应用开发者编写自己的安装脚本。
  • amp 旨在是可移植的——以与常见的 PHP 开发环境(如 Debian/Ubuntu、MAMP、XAMPP 或 MacPorts)一起工作。
  • amp 是为开发和技术测试而设计的。如果您需要在不同环境中自动安装从源代码复制应用程序的副本(用于集成测试、测试用例、演示、错误修复、培训、协作等),那么 amp 可以帮助您。

关于 amp:预-alpha 示例

在撰写本文时,amp 正在开发中,并未完全实现其愿景。在第三行,开发者不应该直接调用 amp create;相反,my-application 的作者应包括一个 install.sh 脚本,下游开发者可以运行它

me@localhost:~/src$ composer create-project example/my-application --dev
me@localhost:~/src$ cd my-application
me@localhost:~/src/my-application$ ./bin/amp config
me@localhost:~/src/my-application$ ./bin/install.sh
Login to the application:
 * URL: ${AMP_URL}
 * Username: admin
 * Password: default

amp config 命令确定如何连接到 MySQL 和 httpd。它可能会扫描本地系统中的常见配置(Ubuntu 与 MAMP 或 MacPorts;Apache 与 nginx),提示用户输入信息,并将信息(在 ~/.amp 中)保留供将来使用。

install.sh 主要针对特定应用程序,但它建立在 amp 之上,以解决设置 mysqld 和 httpd 的繁琐部分。例如,有人可能会说

#!/bin/bash
set -e
APPDIR=`pwd`

## Create a new database and virtual-host
eval $(amp create --root="$APPDIR/web")
amp datadir "$APPDIR/log" "$APPDIR/cache"

## Load DB
cat $APPDIR/sql/install.sql | mysql -u$AMP_DB_USER -p$AMP_DB_PASS $AMP_DB_NAME

## Create config file
cat > $APPDIR/conf/my-application.ini <<MYCONFIG
[mysql]
username=${AMP_DB_USER}
password=${AMP_DB_PASS}
database=${AMP_DB_NAME}
hostname=${AMP_DB_HOST}
MYCONFIG

echo "Login to the application:"
echo " * URL: ${AMP_URL}"
echo " * Username: admin"
echo " * Password: default"

待办事项

请参阅 doc/backlog.md

常见问题解答

问:amp 是否稳定?我应该现在就依赖它吗?

答:可能不是。 amp 是预-alpha。接口和工作流程可能会改变。

问:如何配置 amp 以在系统上工作?

答:运行 `amp config`

问:如何知道 amp 是否正在工作?

答:运行 amp test

问:amp 如何分配虚拟主机名和端口?

A: 您可以通过传递 --url 选项到 create 来指定一个。如果省略,它将使用 localhost 并分配一个替代端口。

Q: amp 如何命名数据库和数据库用户?

A: 名称是通过取目录名(例如 my-application)并附加一些随机字符来计算的。目录名可能会被截断以满足 MySQL 的大小限制。数据库和用户名称相同。

Q: amp 将其配置数据存储在哪里?

A: 默认情况下,存储在 ~/.amp。如果您定义了环境变量 AMPHOME,它将存储在指定的目录中。

Q: 我安装了五个网络应用。AMP如何区分它们?

A: 每个应用都应该有自己的目录(例如 /home/me/src/my-application-1)。默认情况下,amp 假设每个目录对应一个单独的虚拟主机和一个单独的 MySQL 数据库。如果您需要为该应用添加额外的虚拟主机和数据库,请再次使用带 --name 参数的 create 调用。如果您想要额外的虚拟主机 XOR 数据库,指定 --skip-db--skip-url

Q: 如何为 amp 构建独立的 PHAR 可执行文件?

A: 安装 Box。然后,在 amp 源目录中,运行 "php -d phar.readonly=0 which box build"。

内部架构

amp 使用了 Symfony 2 的组件(例如 Console、Config 和 Dependency-Injection)。

在容器中定义了一些关键服务

  • db -- 一个用于创建和销毁 MySQL 数据库的服务(基于 DatabaseManagementInterface
  • httpd -- 一个用于创建和销毁 HTTP 虚拟主机的服务(基于 HttpdInterface
  • perm -- 一个用于设置数据目录文件权限的服务(基于 PermissionInterface
  • hosts -- 一个将主机名映射到本地 httpd 的服务(基于 HostnameInterface
  • instances -- 一个用于 CRUD 网络应用实例的存储库(使用 dbhttpd 服务),将元数据存储在 YAML(~/.app/instances.yml)中。

可能有 dbhttpdhostsperm 的竞争实现 -- 例如,一个实现可能连接到远程 mysqld,而另一个在 ramdisk 上启动本地 mysqld。这些可以在运行时通过调用如命令来选择

## Set options interactively
amp config

## Set options individually
amp config:set --httpd_type=XXX
amp config:set --db_type=XXX
amp config:set --perm_type=XXX

## Set options en masse
amp config:set --httpd_type=XXX --db_type=XXX --perm_type=XXX

参数和服务可以在 amp 的源树(app/defaults/services.yml)或本地家目录(~/.amp/services.yml)中进行配置。通过 CLI(amp configamp config:set 等)输入的参数存储在本地家目录(~/.amp/services.yml)中。