以下のようなディレクトリ構造において、public/
だけをrsync対象にしたい場合があるとします。
deploy_taget
├── .git/
├── src/
├── public/
├── deploy.php
└── README.md
Deployerのrsyncレシピで--include="/public" --exclude="/*"
を期待し、以下のように書いてもうまく動きません。
deploy_bad.php
<?php
require 'recipe/rsync.php'
// (略)
// Rsync Settings
set('rsync_src', __DIR__);
set('rsync_dest', '{{ release_path }}');
set('rsync',[
'include' => ['public'],
'include-file' => false,
'exclude' => ['*'],
'exclude-file' => false,
'filter' => [],
'filter-file' => false,
'filter-perdir'=> false,
'flags' => 'rz', // Recursive, with compress
'options' => ['delete', 'delete-excluded'],
'timeout' => 300,
]);
// Deploy
task('deploy', [
'deploy:prepare', // Create dirs on server
'deploy:release', // Release number on server
'rsync', // Send files to server
'deploy:symlink', // Symlink /current on server
'cleanup', // Cleanup old releases on server
'success',
])->desc('Deploy Project');
これは$ rsync {{$options}} --exclude={{$exclude}} --include={{$include}} --filter={{$exclude}}
の順番で決め打ちされているため、excludeに指定したものが常に最優先となってしまうためです。 (2018/07/09 現在)
Deployerのrsyncレシピでexludeとincludeを同時指定したい場合は、filter
を使ってexlude/includeの順番を明示的に示すのがおすすめです。
deploy_good.php
// (略)
set('rsync',[
'exclude' => [],
'exclude-file' => false,
'include' => [],
'include-file' => false,
'filter' => [
'+ /public',
'- /*',
],
'filter-file' => false,
'filter-perdir'=> false,
'flags' => 'rz', // Recursive, with compress
'options' => ['delete', 'delete-excluded'],
'timeout' => 300,
]);