2012-04-13 6 views
27

異なるオフィスに複数のチームの開発者がいて、プロジェクトのweb.configapp.configファイルのいくつかの構成設定に異なる値が必要です。gitのweb.configとapp.configのマシン固有の設定

これらの設定ファイルをチェックしておくと、デフォルト値がわかります。trunk/masterブランチをチェックすると、設定ファイルを掘り下げる必要がなくなります。

歴史的には、Subversion、特にTortoiseSVNを使用しています。これにより、ローカルの変更を簡単に管理することができました。これらのファイルをTortoiseSVNの自動ignore-on-commitチェンジリストに追加するだけです。これにより、これらのファイルが誤ってチェックインされるのを防ぐことができます。チェックイン時にそのファイルを指定する必要があります(ローカルの設定ノイズではなく、大幅な変更をチェックすることができます)。このアプローチの主な欠点は、設定ファイルが常に「変更された」ように見えるため、ローカルで変更があるかどうかを一目で知ることは不可能です。

私たちはGitに切り替えることを検討しています。私は最良の方法を見つけようとしています。

まず第一に、StackOverflowの他の回答であり、すでに何:

オプション1:xxx.sampleファイルにチェックして、実際の設定ファイルにを.gitignore:これはthis answerで、例えば、推奨されます。コミット者は.sampleファイルに追加する必要がある変更を簡単に見逃す可能性があり、コンシューマ(特に継続的な統合サーバ)は簡単に変更できないことがあります.sampleファイルからローカルの設定ファイルに組み込む必要がある変更がありません。基本的に、それは非常に良い解決策のようには見えません。

オプション2:持ってチェックインされたxxx.defaultsファイルとそれが定義する任意の設定を上書きします.gitignored xxx.local設定ファイル:これはアップ提供され、FRたとえば、here。私たちが標準の.Net設定プロバイダを使って作業しているという問題があります。Mirosoftが既にすべての作業を終えたときに、全く新しい設定ロードフレームワークを実装することは本当にありません。オプションのローカルオーバーライドファイルを参照するapp.configファイルとweb.configファイルを取得する方法を知っている人はいますか?

オプション3:開発者がローカルのブランチを維持しており、その後、彼らは常に、常にバイパス/地元の支店に不要なコミットを避けるために、マスターにチェリーピックやリベース支店にチェックインしている:これは可能性として提供されていますワークフローhereと、変更トラッキング(チェックインされたものすべて)の清潔さに感謝しますが、かなりの量のが必要です。すべてのチェックインには、オーバーヘッドが必要です。それは大きな痛みです!

オプション4:設定ファイルは、チェックインしましたが、それらは--assume-unchangedが付いている:これは、可能なオプションhereとして提供されています。あなたがTortoiseSVNのチェンジリストignore-on-commitと似ていますが、コミットプロセスでこれらの "隠された"変更されたファイルが表示されていないことを除けば、例えば、TortoiseGitは、ファイルに "変更された"アイコンオーバーレイを表示しますが、コミットダイアログではファイルはまったく表示されません。これはちょっと恐ろしいように思えますが、やはり変更を忘れてしまいます。

私が見つけたこれらすべてのオプションがあれば、チェックインされたapp.config/web.configファイルにローカルの設定ファイルをオプションで "含める"ことを望んでいますオプション2としてください。誰かがこれを行う方法、または私が行方不明の他のオプションを知っていますか? (私はかすかにカスタムXMLマージ前のビルドステップを検討するように誘惑されています...)

私は以前に説明したはずですが、私たちはまだVS2008にいるので、構成変換は利用できません。


UPDATE:(削除、平野間違っていた)

UPDATE 2:私は私の以前の更新との回答を削除した、それは愚かだった/動作しませんでした。私たちが "私たち"がマージした後、他の方向の次のマージがそれらのファイルの "元の"バージョンを戻す(ローカルブランチの変更を上書きする)ことはわかりませんでした。興味がある場合は編集履歴をご覧ください。この質問はこれまでどおりに開いています。

+0

あなたはどのようなアプローチをとったのですか?ありがとう。 – Hewins

+1

私たちは、数え切れないほど多くのフープを飛び越えずに共有できない内部ツールを構築しました。 「テンプレート」ファイル内のプレースホルダをサポートしているだけで、「最終」ファイルに変換されます。プレースホルダと値のマッピングは、チェックインされていない「デフォルト」のドキュメントとチェックインされていないローカルドキュメント(.gitignored)という単純なXmlドキュメントのペアに格納されます。テンプレートファイルはチェックインされますが、すべての出力ファイルは.gitignoredです。これは、 "矛盾の上書き"モード、または最終的な(例えばweb.config)ファイルを使用して対応するテンプレートを更新したい "矛盾の警告"モードで実行できます。 – Tao

答えて

1

this answer for Managing complex Web.Config files between deployment environmentsDanで解決する可能性があります。私は水銀を使用し、これと同じプロセスを使用して一般的なweb.configファイルをチェックインし、Webトランスフォームを使用してconfigSourceの場所を自分の展開固有のものを指すように変更します。

このルートを使用する利点は、フレームワークに完全に組み込まれており、余分なコードを必要とせず、Webデプロイメントでも機能することです。

web.configファイルにチェック:

web.debug.configにチェック
<?xml version="1.0"?> 
<configuration> 
    <!-- snip --> 
    <connectionStrings configSource="config/connectionStrings.config" /> 
</configuration> 

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings 
     configSource="config/dev.connectionStrings.config" 
     xdt:Transform="Replace(configSource)" /> 
</configuration> 

私はconfig/connectionStrings.configはデフォルトでチェックインしたが、開発サーバがconfig/dev.connectionStrings.configがチェックインされていません新しい展開では置き換えられません。

+1

これは、VS内で実行しているときではなく、デバッグとしてローカルまたはdevサーバーにパブリッシュする場合にのみ機能します。 – CodeMonkey1313

+0

同じロジックをそのまま逆に適用することはできます。カスタム.configファイルをweb.configで指定してから、公開時に変換ファイルを使用し、ローカル設定ファイルで '.gitignore'を実行します。 'configSource'を使うことで.Netは別のコードを必要とせずに異なるファイルを自動的にマージします。 – Joshua

+0

うん、私たちはVS2008で立ち往生しており、Webデプロイメントを使用していない(そして他の非ASPアプリケーションコンポーネントを持っている)が、この 'configSource'は思考のための食糧だ。 – Tao

12

ConfigGenをご覧ください。私たちはすべてのプロジェクトでこれを使用し、すべての開発者にとって、そしてすべての環境でも不思議に思っています。基本的には、マシン名と出力設定ファイルを記述したスプレッドシートから実行され、App.ConfigまたはWeb.Configというテンプレートがトークン化され、スプレッドシートの値がそこに置き換えられます。あなたのプロジェクトにconfiggenを実行するための簡単なビルド前のステップを追加して、ビルドが始まる前に、あなたのマシン用のカスタマイズされた設定ファイルを用意してください。また、デフォルト設定もサポートしています。

サイトを見て、自分のことを考えてみてください。しかし、私は確かにそれを保証することができます。

EDIT:すべてのWeb.configファイルとApp.configファイルを(.gitに関して)無視することはできません。しかし、テンプレートとスプレッドシートをレポに追加する必要があります。また、スプレッドシートのxml置換が含まれている可能性があるため、DVCSに適したものになっています。

編集2:ダニエルの投稿をこちらからご覧ください:https://stackoverflow.com/a/8082937/186184彼は、テンプレートとスプレッドシートの非常に明確な例と、あなたのソリューションでそれを動作させる方法を示します。

+0

ありがとう、これは最も単純で最も賢明な解決策のように見える – Tao

+0

私はあなたの答えをdownvoteしなかったことを明確にする;)(特に私はこのページで私自身の答えがあるので) – VonC

+1

ConfigGenはcsv設定をサポートするようになりましたファイル、およびグローバル設定を1つのファイルに保存し、アプリケーションごとにより特定の設定ファイルとマージすることができるグローバルデフォルト設定ファイルが含まれています。 –

0

私たちも同様のジレンマに遭遇しました。私たちは、メインブランチを補完する別々の設定ブランチを作成しました。たとえば、-development-config、master-configなどのように、デプロイメント環境に基づいて適切なソースブランチを持つブランチをリベースする小さなスクリプトを作成します。たとえば、開発マシンでは、開発用にconfigをrebaseします。ローカルマシンで作業している場合、メインブランチ(ローカルDB名、パスワードなど)にチェックインされているデフォルト設定(すべての開発者が合意)を取得します。もちろん、欠点は、* -configブランチを常に最新の状態に保つか、または展開時に速度を上げる必要があることです。

このワークフローを実装して以来、幾分似たアプローチをとっているwhiskey_diskのようないくつかのデプロイメントツールが出てきました。実際、私は彼らのソリューションがはるかに安全でフレキシブルなので、もっと好きです。おそらくLAMP/RoRの開発スタックに向けて調整されて以来、皆さんには適していませんが。それはさておき

、いくつかの商用ソリューションは、あなたがBeanstalk

5

のようなを見てみたいかもしれないとそこにもありますがcontent filter driverを検討しましたか?意味し、各git checkoutに、汚れスクリプトはに基づい実際の設定ファイルを生成する

content filter dfriver

:( @@[email protected]@ような設定値のプレースホルダを有する)

  • 設定テンプレートファイル
  • 設定値ファイルの1つ(各開発者は、自分の設定ファイル値をバージョン管理することができます)

マージ問題とgitignore設定を避ける:それぞれの「設定値ファイル」は異なっていて、別々のままです。
pms1969answerで言及されているConfigGenのような他の設定生成ソリューションと互換性があります。

+0

ええと、これは楽しいようです - 遊びに行く必要があります – Tao

+0

私はここで何かを誤解していない限り、このような流れが働くためには双方向のコンテンツ変換を確立する必要があります。チェックインからローカルへの変更(プレースホルダの置き換え、または単一のプレースホルダ+テンプレート+値ファイルからのファイルコンテンツの構築)、ローカルからチェックイン(認識されたいくつかに基づいてインプレースファイル/コンテンツを元のプレースホルダに置き換えるコンテンツの一部)。いいことは、(libgit2のようなものではなくgitを使っている限り)チェックアウト時に自動的に行われるということですが、これはカスタムビルドステップよりもはるかに複雑に見えます... – Tao

+0

@Taoはい 'clean ''スクリプトは、生成されたファイルに行ったローカルの変更を保存する必要がある場合に使用されます。そして 'libgit2'は' smudge'(少なくとも少しの汚れ)をサポートしています。 4日後:http://article.gmane.org/gmane.comp.version-control.git/197996 – VonC

0

2012年以降、少し変わってきましたが、今はビルド/デプロイメントツール(VS Team Services、TeamCity、Octopus Deploy)が環境固有の設定を管理することをお勧めします。

あなたが紺碧で作業している場合は、アプリケーション設定と接続文字列をアプリケーション定義の一部として定義できます。