capistranoはRails専用と考えるより、汎用アプリと考える [プログラミング]
Railsをデプロイするためのソフトだと思っていたcapistranoですが、汎用SSHソフトと見ておいた方がいいみたいです。色々ググって見てきましたが、基礎的な部分ってのは、Railsに特化している事はないのでした。とはいえ、Rubyで作られいて、設定の記法が内部DSLなので、Rubyな書き方ができるっていうのは、RailsユーザーやRubyistには親和性が高いのでしょう。
でもDSLって細かく調べた事ないな。使う言語と違うフォーマットを使うものは、外部DSLで、外に別ファイルとして設定などを切り離しているにもかかわらず、使用言語の文法で書けるのが内部DSLとザックリ理解しています。
まぁ今までは、バイナリのアプリケーションと、テキストファイルの組み合わせで、わざわざ同じ言語に揃える意味はなかった。他のアプリから読み込む関係から言っても、特定言語にする意味合いがない。とはいえ、何らかの法則性がないといけないんだけど、結局データを渡すのにCSVとかだったりするわけだ。そういう一般性にとどめを刺したのはXMLだと思うけど、XMLははじめは機械にも人間にも読みやすいと言われていたけど、実はそれほどでもなくて、開発ではJSONとかYAMLとか使われているわけだ。
その方向性とは別に、LLを中心に内部DSLが台頭してきた。どこかのサイトには、Rubyは内部DSLが書きやすいから普及したみたいな事も書いてあった。確かに設定ファイルにある程度、言語要素を持ち込んだ方が設定しやすい事は確かだ。でも、それをやり過ぎると、設定してるんだかプログラミングしてるんだか訳が分からなくなる。とはいえ、設定ファイルなんて開発者ぐらいしか触らないからいいか、的なところがあるのだろう。
更に内部DSLが進められた理由として、インタプリタであるという事もあるのだろうと思う。内部DSLがどのような動作で動いているのか知らないですが、インタプリタで動いている以上、同じ記法で書かれている設定ファイルを動作環境に引き渡すのはそれほど難しい事ではないはずです。外部DSLだと、結局のところ、内部に外部DSL用のインタプリタを持たないといけないので、いちいちインプリするのが面倒くさいですよ。まぁ大抵、誰かがそういうライブラリを書いてくれてるから問題ないんですけどね。
よく考えたらDSLって何の略か知らないや。ドメイン固有(特化)言語(Domain Specific Language)の略称だそうです。そもそもドメインとは何ぞやって所にひっかかるところですが、一般的なURLの部分ではなくて、一般的な英語としての、「範囲、領域」という意味で使われてるんでしょうね。Wikipediaで見たけど、カテゴライズが微妙過ぎて分かんないや。使用言語のサブセットで設定手続きが書ける、って事でいいか。
あぁ、Railsでのcapistranoの設定を少し書いておきます。そっちの方がメインで書くつもりだったのに脱線気味です。いつもそんな感じですが。
探したのはRailsとpassengerを連携させていたので、Railsの中のWebサーバを蹴ってなかった。
http://miff.blog.so-net.ne.jp/2013-03-04-1
結局、内容をよく分かってなかったので、config/deploy.rbの設定ができなかったりしました。
分かってなかったところ。
・そもそも「cap deploy:start」の動作が定義されてないこと。
・「cap deploy:start」をconfig/deploy.rbで設定する事。
・デプロイ先の最新アプリが固定パス(リンク)で設定されている事。
良く考えると、capistranoがRailsに特化しているわけじゃないので、デプロイされたアプリが動作するまで面倒を見てくれているのは考えにくいですよね。まぁそこまでやってくれても良かったけど、逆に動作させない方が自分で手を入れて、設定ファイルの内容が分かるし、自分でカスタマイズできるから、そっちの方が有益かもね。
とりあえず、config/deploy.rbの設定。
これで大丈夫だと思う。わざわざ「&&」で一行で設定したのは、逐一、runでやってるとコマンドを使った設定が持たないから。
run "cd #{deploy_to + "current"}"
run "rails s"
とかにすると、rails sの時に、ホームディレクトリに戻っちゃうんだよね。んで、実行できなくなる。でも、これだと普通にスクリーンを掴んだまま戻ってこないかな。それと、例を挙げると
task :restart, :roles => :app do
の時とかの「:roles => :app」の意味が分かってない。後で調べておこうか。どっちにしても、内部DSLのおかげで、大体の事がRubyの範疇で解決できる。お気楽だなぁ。
今まではローカルで全部やっていたので、仮想サーバを適当に立てて、そこにデプロイしたい。その設定にはChefとか必要かなぁ。やっておいた方が良さそう。
でもDSLって細かく調べた事ないな。使う言語と違うフォーマットを使うものは、外部DSLで、外に別ファイルとして設定などを切り離しているにもかかわらず、使用言語の文法で書けるのが内部DSLとザックリ理解しています。
まぁ今までは、バイナリのアプリケーションと、テキストファイルの組み合わせで、わざわざ同じ言語に揃える意味はなかった。他のアプリから読み込む関係から言っても、特定言語にする意味合いがない。とはいえ、何らかの法則性がないといけないんだけど、結局データを渡すのにCSVとかだったりするわけだ。そういう一般性にとどめを刺したのはXMLだと思うけど、XMLははじめは機械にも人間にも読みやすいと言われていたけど、実はそれほどでもなくて、開発ではJSONとかYAMLとか使われているわけだ。
その方向性とは別に、LLを中心に内部DSLが台頭してきた。どこかのサイトには、Rubyは内部DSLが書きやすいから普及したみたいな事も書いてあった。確かに設定ファイルにある程度、言語要素を持ち込んだ方が設定しやすい事は確かだ。でも、それをやり過ぎると、設定してるんだかプログラミングしてるんだか訳が分からなくなる。とはいえ、設定ファイルなんて開発者ぐらいしか触らないからいいか、的なところがあるのだろう。
更に内部DSLが進められた理由として、インタプリタであるという事もあるのだろうと思う。内部DSLがどのような動作で動いているのか知らないですが、インタプリタで動いている以上、同じ記法で書かれている設定ファイルを動作環境に引き渡すのはそれほど難しい事ではないはずです。外部DSLだと、結局のところ、内部に外部DSL用のインタプリタを持たないといけないので、いちいちインプリするのが面倒くさいですよ。まぁ大抵、誰かがそういうライブラリを書いてくれてるから問題ないんですけどね。
よく考えたらDSLって何の略か知らないや。ドメイン固有(特化)言語(Domain Specific Language)の略称だそうです。そもそもドメインとは何ぞやって所にひっかかるところですが、一般的なURLの部分ではなくて、一般的な英語としての、「範囲、領域」という意味で使われてるんでしょうね。Wikipediaで見たけど、カテゴライズが微妙過ぎて分かんないや。使用言語のサブセットで設定手続きが書ける、って事でいいか。
あぁ、Railsでのcapistranoの設定を少し書いておきます。そっちの方がメインで書くつもりだったのに脱線気味です。いつもそんな感じですが。
探したのはRailsとpassengerを連携させていたので、Railsの中のWebサーバを蹴ってなかった。
http://miff.blog.so-net.ne.jp/2013-03-04-1
結局、内容をよく分かってなかったので、config/deploy.rbの設定ができなかったりしました。
分かってなかったところ。
・そもそも「cap deploy:start」の動作が定義されてないこと。
・「cap deploy:start」をconfig/deploy.rbで設定する事。
・デプロイ先の最新アプリが固定パス(リンク)で設定されている事。
良く考えると、capistranoがRailsに特化しているわけじゃないので、デプロイされたアプリが動作するまで面倒を見てくれているのは考えにくいですよね。まぁそこまでやってくれても良かったけど、逆に動作させない方が自分で手を入れて、設定ファイルの内容が分かるし、自分でカスタマイズできるから、そっちの方が有益かもね。
とりあえず、config/deploy.rbの設定。
namespace :deploy do task :start do run "cd #{deploy_to + "current"} && rails s" end end
これで大丈夫だと思う。わざわざ「&&」で一行で設定したのは、逐一、runでやってるとコマンドを使った設定が持たないから。
run "cd #{deploy_to + "current"}"
run "rails s"
とかにすると、rails sの時に、ホームディレクトリに戻っちゃうんだよね。んで、実行できなくなる。でも、これだと普通にスクリーンを掴んだまま戻ってこないかな。それと、例を挙げると
task :restart, :roles => :app do
の時とかの「:roles => :app」の意味が分かってない。後で調べておこうか。どっちにしても、内部DSLのおかげで、大体の事がRubyの範疇で解決できる。お気楽だなぁ。
今まではローカルで全部やっていたので、仮想サーバを適当に立てて、そこにデプロイしたい。その設定にはChefとか必要かなぁ。やっておいた方が良さそう。
タグ:capistrano
コメント 0