Capistrano設定ファイルにおけるsetとappendの違い
設定ファイルを理解する上でつまったポイント
参考にする記事間で:linked_dirs
と:linkerd_filed
部分の記述がappend
だったりset
だったりとまちまちだったので、これらの違いと、そもそもsetやappendは何をしているのか?
を調べてみました。
そもそも
deploy.rb
などcapistranoの設定ファイルで、capistranoのDSLとして主に用いられているメソッドは、以下の2つになっている。
set :変数名, 値 #値の設定
fetch :変数名 #値の参照
e.g.)
set :repo_url, 'git@github.com:hogehoge/sample_app'
fetch :repo_url
#=> "git@github.com:hogehoge/sample_app"**
setで値を設定し、fetchで参照できるようになっている。
なるほど、そしてappendというのはなんなのだろう?
公式docを確認
appendに対しての記述があった部分を抜粋しました。
New in Capistrano 3.5:
for a variable that holds an Array, easily add values to it usingappend
. This comes in especially handy for:linked_dirs
and:linked_files
(see Variables reference below).
以下雑な訳です。
Capistrano 3.5の新機能:
配列を保持する変数に対して、append
を使うことで簡単に、値を挿入できるようになります。この機能は特に、
:linked_dirs
と**:linked_files
**の変数に対して有用です。
(詳細については、下記の変数一覧を参照してください。)
(さらに参考)
githubのリポジトリでCapistranoのソースものぞいてみました。
39行目に、メソッドとして定義されてありました。
#capistrano/lib/capistrano/configuration.rb
def append(key, *values)
set(key, Array(fetch(key)).concat(values))
end
なるほど確かに、いわゆるArray#append(Array#push)メソッドのように、設定のための変数に値を格納できるようになってました。
結論
配列として値を保持する変数(e.g. :linked_dirs
)などを設定する時には、setでもできるけど、appendが便利だよ。
:linked_dirs
と:linked_files
って?
補足 例よって、また公式ドキュメントをみてきました。
:linked_files
- default:
[]
- Listed files will be symlinked from the shared folder of the application into each release directory during deployment.
- Can be used for persistent configuration files like
database.yml
. See Structure for the exact directories.:linked_dirs
- default:
[]
- Listed directories will be symlinked into the release directory during deployment.
- Can be used for persistent directories like uploads or other data. See Structure for the exact directories.
Capistranoはデプロイ先に
- current
- releases
- shared
といったディレクトリを作成するのですが、この中でもshared
は、デプロイされるごとに変更されないようなdatabase.ymlなどのファイルを置いておくためのディレクトリになります。
そこに入れておきたいファイル群を、linkded_filesとlinked_dirsで指定しておくと各デプロイされた世代間で、sharedを参照する形で共有できるらしいです。
終わりに
解決した後にみてみると、appendかsetなのかは些末なことに思えて来ましたが、おかげでCapistranoのディレクトリ構造や仕組みについても少し理解できたのでよかったかなと思います。
Discussion