幸运的是, Airdrop的存在.
[Laravel Airdrop]是一个工具,可以存储你构建的静态资产。当你做CI运行时, Airdrop会检查你的静态资产是否有变化。
如果资产没有改变, Airdrop会从存储区下载它们并放置在正确的位置 - 让你跳过构建你的资产.
如果它们已经改变了,那么你就可以像往常一样使用Node来构建你的静态资产。
这对于节省CI和部署的时间非常好。
下面是如何使用Airdrop的方法。
安装
安装[Airdrop]很简单。
composer require hammerstone/airdrop
# Add config/airdrop.php to your project
php artisan airdrop:install
配置Airdrop
在Airdrop中只有几样东西需要配置--而且其中有一堆可以保留为默认值。
触发器
你可以告诉Airdrop何时决定重新构建静态资产。
触发器是特定于环境的(APP_ENV)--每个环境都有自己的一组文件。这就是所谓的配置触发器。
另一个触发器是FileTrigger 。它跟踪配置的文件,并在文件发生变化时重新构建资产。
FileTrigger 会检查。
resources中的文件(CSS、JS等)。- 如果Webpack/Vite的配置文件发生变化
我还添加了NPM产生的package-lock.json 文件。
<?php
use Hammerstone\Airdrop\Drivers\FilesystemDriver;
use Hammerstone\Airdrop\Drivers\GithubActionsDriver;
use Hammerstone\Airdrop\Triggers\ConfigTrigger;
use Hammerstone\Airdrop\Triggers\FileTrigger;
return [
'driver' => env('AIRDROP_DRIVER', 'default'),
'drivers' => [
'default' => [...],
'github' => [...],
],
'triggers' => [
ConfigTrigger::class => [
'env' => env('APP_ENV')
],
FileTrigger::class => [
'include' => [
resource_path(), // default
base_path('webpack.mix.js'), // mix default
base_path('vite.config.js'), // vite default
base_path('package-lock.json'), // my addition here
],
],
],
'outputs' => [...],
];
驱动程序
你可以决定Airdrop将存储静态资产的地方。通常你只需要在这里使用FilesystemDriver ,并使用Laravel的Storage 机制来告诉Airdrop将文件放在哪里。
disk 的设置与使用的Laravel "磁盘 "存储有关。建议使用一些远程存储,如s3 ,。
GitHub Actions Driver可以让你把文件保存到GH Actions缓存中,这非常方便!
return [
// The driver you wish to use to stash and restore your files.
'driver' => env('AIRDROP_DRIVER', 'default'),
'drivers' => [
'default' => [
// The class responsible for implementing the stash and restore
// logic. Must extend BaseDriver.
'class' => FilesystemDriver::class,
// The disk on which to store the built files.
'disk' => env('AIRDROP_REMOTE_DISK', 's3'),
// The folder (if any) where you'd like your stashed assets to reside.
'remote_directory' => env('AIRDROP_REMOTE_DIR', 'airdrop'),
// A writeable directory on the machine that builds the assets.
// Used to build up the ZIP file before stashing it.
'local_tmp_directory' => env('AIRDROP_LOCAL_TMP_DIR', storage_path('framework')),
// The skip file is an empty file that will be created to
// indicate that asset building can be skipped.
'skip_file' => env('AIRDROP_SKIP_FILE', base_path('.airdrop_skip')),
],
],
// ...
];
输出
输出是Airdrop将为你存储和检索的文件。你通过触发器 "观察 "的文件不一定是你让Airdrop为你保存/储存的相同文件
Airdrop的默认值非常好,但当然你可以根据需要配置这些。
return [
// ...
'outputs' => [
/*
* Files or folders that should be included.
*/
'include' => [
// Mix/Webpack
public_path('mix-manifest.json'),
public_path('css'),
public_path('js'),
// Vite
public_path('build/manifest.json'),
public_path('build/assets'),
],
// ...
],
];
注意:在使用Airdrop时,你可能不想提交静态资产到你的版本库。为了避免这一点,并完成对Airdrop的配置,请在你的.gitignore 文件中加入以下内容。
/.airdrop_skip
# Mix/Webpack
public/css/*
public/js/**
# Vite
public/build/*
集成Airdrop
当你在CI中构建你的应用Airdrop时,或者在部署脚本中(这对Forge的快速部署非常有用!),你可以运行以下内容。
# Download files, only if needed
php artisan airdrop:download
# Airdrop creates .airdrop_skip if
# it downloaded files
if [ ! -f ".airdrop_skip" ]; then
npm ci --no-audit
npm run dev
fi
# Upload the files if needed
php artisan airdrop:upload
归入。