statamic / ssg
使用Statamic生成静态站点。
Requires
- statamic/cms: ^5.0.0
Requires (Dev)
- orchestra/testbench: ^8.0 || ^9.0
Suggests
- spatie/fork: Required to generate pages concurrently (^0.0.4).
README
使用Statamic生成静态站点。
安装
您可以使用以下命令安装Static Site Generator包
php please install:ssg
该命令将通过Composer安装statamic/ssg
包,可选地发布配置文件,并提示您是否希望安装spatie/fork
包以运行多个工作进程。
用法
运行以下命令
php please ssg:generate
您的站点将被生成到您可以根据需要部署的目录中。以下面的部署示例获取灵感。
多个工作进程
为了提高性能,您可以将页面生成分散到多个工作进程中。这需要Spatie的Fork包。然后您可以选择要使用的工人数。您可以使用与CPU核心数一样多的工作进程。
composer require spatie/fork
php please ssg:generate --workers=4
路由
路由将不会自动生成。您可以通过将它们添加到配置文件中的urls
数组来生成任何您希望生成的额外URL。
'urls' => [ '/this-route', '/that-route', ],
您还可以排除单个路由或带有通配符的路由组。这将覆盖urls
配置中的任何内容。
'exclude' => [ '/secret-page', '/cheat-codes/*', ],
动态路由
您可以通过向addUrls
方法提供一个返回数组的闭包来动态添加URL。
use Statamic\StaticSite\SSG; class AppServiceProvider extends Provider { public function boot() { SSG::addUrls(function () { return ['/one', '/two']; }); } }
分页路由
在您的antlers模板中检测到分页的地方(例如,如果您在collection
标签上使用paginate
参数),将自动生成多个页面,具有/articles/page/2
样式的URL。
您可以在config/statamic/ssg.php
中配置自定义路由样式。
'pagination_route' => '{url}/{page_name}/{page_number}',
生成后回调
您可以选择在站点生成后定义额外的步骤执行。
use Statamic\StaticSite\SSG; class AppServiceProvider extends Provider { public function boot() { SSG::after(function () { // eg. copy directory to some server }); } }
Glide图片
Statamic的默认配置是使用“动态”图片,这意味着glide
标签将只输出URL。图片本身将在访问URL时生成。对于静态站点,这不再有意义,因为通常会在没有动态Glide路由的地方部署。
默认情况下,SSG将自动重新配置Glide,在每次使用glide
标签时将图片生成到img
目录中。这本质上是Glide的自定义静态路径选项。
您可以自定义图片的生成位置
'glide' => [ 'directory' => 'images', ],
如果您正在使用自定义Glide磁盘,您可以将SSG告知不要更改它
'glide' => [ 'override' => false, ],
然后生成完成后复制图片(或创建符号链接)
SSG::after(function () { $from = public_path('img'); $to = config('statamic.ssg.destination').'/img'; app('files')->copyDirectory($from, $to); // or app('files')->link($from, $to); });
触发命令失败
如果您在CI环境中使用SSG,您可能希望如果任何页面没有生成(例如,防止部署不完整的站点),则防止命令成功。
默认情况下,即使有未生成的页面,命令也会完成并退出,返回成功代码。您可以配置SSG在出现错误时提前失败,甚至是在警告时。
'failures' => 'errors', // or 'warnings'
部署示例
以下示例假设您的流程是在本地创作内容,而不是在生产中使用控制面板。
部署到 Netlify
部署由提交到Git并将代码推送到GitHub触发。
- 在您的 Netlify 账户中创建一个站点
- 将站点链接到您希望使用的GitHub仓库
- 添加构建命令
php please ssg:generate
(如果需要编译css/js,请确保添加该命令并在生成静态站点文件夹之前执行它。例如,npm install && npm run build && php please ssg:generate
)。 - 设置发布目录
storage/app/static
当您的站点有了 APP_URL...
- 将其设置为环境变量。添加
APP_URL
https://thats-numberwang-47392.netlify.com
最后,在本地使用 php artisan key:generate
生成一个 APP_KEY
并复制其值,然后...
- 将其设置为环境变量。添加
APP_KEY
[your app key value]
S3 资产容器
如果您将资产存储在S3桶中,使用的.env
需要与Laravel默认的有所不同,因为它们已被Netlify保留。例如,您可以修改如下
# .env
AWS_S3_ACCESS_KEY_ID=
AWS_S3_SECRET_ACCESS_KEY=
AWS_S3_DEFAULT_REGION=
AWS_S3_BUCKET=
AWS_URL=
务必也更新您的 s3
磁盘配置中的这些设置
// config/filesystems.php 's3' => [ 'driver' => 's3', 'key' => env('AWS_S3_ACCESS_KEY_ID'), 'secret' => env('AWS_S3_SECRET_ACCESS_KEY'), 'region' => env('AWS_S3_DEFAULT_REGION'), 'bucket' => env('AWS_S3_BUCKET'), 'url' => env('AWS_URL'), ],
部署到 Vercel
部署由提交到Git并将代码推送到GitHub触发。
- 创建一个名为
./build.sh
的新文件,并粘贴下面的代码片段。 - 在终端运行
chmod +x build.sh
确保文件在部署时可以被执行。 - 在您的 Vercel 账户中导入一个新的站点
- 将站点链接到您希望使用的GitHub仓库
- 添加构建命令
./build.sh
- 设置输出目录为
storage/app/static
- 在项目设置中添加环境变量:
APP_KEY
<从开发中复制 & 粘贴>
build.sh 代码
将以下片段添加到 build.sh
文件中,以安装PHP、Composer并运行 ssg:generate
命令
#!/bin/sh
# Install PHP & WGET
yum install -y amazon-linux-extras
amazon-linux-extras enable php7.4
yum clean metadata
yum install php php-{common,curl,mbstring,gd,gettext,bcmath,json,xml,fpm,intl,zip,imap}
yum install wget
# INSTALL COMPOSER
EXPECTED_CHECKSUM="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org.cn/installer', 'composer-setup.php');"
ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ]
then
>&2 echo 'ERROR: Invalid installer checksum'
rm composer-setup.php
exit 1
fi
php composer-setup.php --quiet
rm composer-setup.php
# INSTALL COMPOSER DEPENDENCIES
php composer.phar install
# GENERATE APP KEY
php artisan key:generate
# BUILD STATIC SITE
php please ssg:generate
部署到 Surge
前提条件:使用 npm install --global surge
进行安装。您的第一次部署将涉及通过命令行创建账户。
- 使用命令
php please ssg:generate
进行构建 - 使用
surge storage/app/static
进行部署
部署到 Firebase hosting
前提条件:按照指示进行开始使用Firebase hosting
- 一旦设置好托管,请确保您的
firebase.json
中的public
配置设置为storage/app/static
- (可选)添加
predeploy
配置以运行php please ssg:generate
- 运行
firebase deploy