2009-06-12 28 views
3

Gitをバージョン管理システムとして使用してCakePHPでシステムを開発しています。テスト用のサーバーには作業コピーがあり、別のデータベースには作業用のサーバーがあります。変更を行うたびに、システムをテストできるようにデータベース構成を変更する必要があります。異なる内容を持つ2つのファイルをテスト用に1つずつ、プロダクションサーバーに別の方法で保存する方法はありますか?ブランチは良い方法ですか?テスト環境とプロダクション環境を設定する

答えて

1

かなり粗くて効果的なテクニックに移行しました。私の開発環境では、「environment_development」という空のファイルがあります。私のプロダクション環境では、「環境プロダクション」と呼ばれるものがあります(ビジュアル強調のための別のケース)。私のgitignoreファイルは、これらの両方を無視するように設定されています。

私のアプリケーションのフロントコントローラ(私はKohanaフレームワークを使用していますが、CakePHPは何か類似していると推測しています)は、これらのファイルの有無をチェックし、IN_PRODUCTION定数を適切に設定します。残りのコード(データベース構成、エラー処理など)はこの定数の値をチェックし、必要に応じて動作を変更できます。

私は、$ _SERVER [「SERVER_NAME」]チェックを使用するために使用されるが、この方法は、次のような利点があります

  1. それはあなたがコマンドラインから実行したいのアプリの部分がある場合でも動作します例えば、$ _SERVERが設定されていない場合、cronjobsとして使用されます。
  2. アプリが複数のドメインで実行されている場合でも機能します。
  3. 誰かがアプリケーションの別の作業コピーをチェックアウトすると、環境ファイルを作成するまで機能しないので、開発者が本番データベースに対して開発コードを実行する可能性はほとんどありません。 。
4

あなたはブランチでそれをしたくないでしょう。私はPHPに具体的に話すことはできませんが、別のブランチに2つのファイル(テスト設定&プロダクション設定)を保存するのではなく、それらをまとめておきますが、環境変数で、ランタイム。

(これは、それがRailsの中で行うのかであり、それはうまく動作します。)

+1

私は同意します。実際にバージョンに関係していないものについては、あなたのバージョン管理ソフトウェアに非常に頼りにしたくありません。あなたは、本質的にテスト可能であるようにアプリケーションを設計する方がよいでしょう。 –

0

データベースは、環境に依存している場合、あなたはdatabase.phpファイル内でこのような何かを行うことができます。私は

class DATABASE_CONFIG { 

    var $default = NULL; 

    var $prod = array(
     'driver' => 'mysql', 
     'persistent' => false, 
     'host' => 'localhost', 
     'login' => 'username', 
     'password' => 'password', 
     'database' => 'productionDatabaseName', 
     'prefix' => '', 
    ); 

    var $staging = array(
     'driver' => 'mysql', 
     'persistent' => false, 
     'host' => 'localhost', 
     'login' => 'username', 
     'password' => 'password', 
     'database' => 'stagingDatabaseName', 
     'prefix' => '', 
    ); 

    //var $dev = ... 

    // Chooses production or staging depending on URL 
    function __construct() 
    { 
     if(isset($_SERVER['SERVER_NAME'])) 
     { 
      switch($_SERVER['SERVER_NAME']) 
      { 
       case 'myhostname.com': 
       case 'www.myhostname.com': 
        $this->default = $this->prod; 
        break; 
       case 'staging.myhostname.com': 
        $this->default = $this->staging; 
        break; 
       default: 
        $this->default = $this->dev; 
      } 
     } 
     else // Use local for any other purpose 
     { 
      $this->default = $this->dev; 
     } 
    } 
}