web-dev-qa-db-ja.com

生成されたコードをソース管理にチェックインしますか?

私はgoogleプロトコルバッファーを使用する.Netアプリケーションを開発しています。これまで、アプリケーションは、protobuf-netチームが提唱した、.protoファイルを使用する代わりに属性でクラスを装飾するアプローチを使用していました。

現在、アプリケーションのクライアントの一部を別のテクノロジーに移行する過程にあり、2つのテクノロジーが相互運用できるように、.protoファイルをオーソリティとして使用することを強く望んでいます。

私の計画は.protoからC#を自動的に生成することですが、私の質問は、結果のファイルをソース管理にチェックインする必要があるかどうかです。コード生成のプロセスが高速になることを期待しています。

上記のケースに適切なアプローチを選択するにはどうすればよいですか?ベストプラクティスとは何ですか?

41
Dave Hillier

原則として、生成されたファイルはソースコードリポジトリに属しません。

これらのファイルをリポジトリに配置するときに実行する最大のリスクは、ファイルがソースと同期しなくなり、ビルドが.protoファイルに基づいて考えるよりも異なるプロトコルバッファーファイルで実行されることです。

一般的な規則から逸脱するいくつかの理由は

  • ビルド環境では、追加のビルドステップを自動的に処理できません。いずれにしても、ビルドごとに手動でファイルを生成する必要がある場合は、VCSに配置することもできます。次に、生成ステップを実行する必要のある人が少なくなるため、バージョンの不一致のリスクが実際に減少します。
  • 生成ステップにより、ビルドが大幅に遅くなります
  • それらを生成した後、ファイルはさらに手動で変更されます。その場合、それらは実際には生成されたファイルではなくなり、VCSに属します。
  • ソースファイルが変更されることはめったにありません(たとえば、更新は数か月ごとにしか提供しないサードパーティからのものなど)。

何よりもまず、バージョン管理ソフトウェアは、あなたがあなたの仕事をするのを助けるためにそこにあります。したがって、最初に尋ねる質問は「Xをバージョン管理に入れるべきでしょうか」ではありません。しかし、むしろ「バージョン管理にXを入れることは私を助けるでしょうか?」多くの場合、これら2つは同じ答えを持っていますが、必ずしもそうではありません。

言い換えると、これらのファイルがバージョン管理にあるべきかどうかをsに尋ねるのではなく、-yourselfに問い合わせることでyo =。ファイルの生成が速い場合、生成されたデータを保存することにはどのような価値がありますか?ビルドスクリプトは、常にファイルを生成するように設計されていますか、それとも最初に何かがディスク上にあるかどうかを確認するように設計されていますか?

また、ビルドに何が入ったかを具体的に記録することが重要かどうかも自問する必要があります。ビルドを正確に再現する必要がある場合は、それらのファイルをソース管理に置くと価値がある場合があります。将来のビルドでは、わずかに異なるファイルを生成する新しいバージョンのツールを使用する可能性がありますが、ツール自体をバージョン管理することもできます。

肝心なのは、他の誰かの標準のアイデアに基づいて何をすべきか、またはすべきでないかについてそれほど心配しないで、プロジェクトに最適なことを行うことです。私たちはあなたが扱っているすべての制約と要件を知っているわけではないので、あなただけがそれに答えることができます。

19
Bryan Oakley

.netの多くのファイルはVisual Studioによって自動的に生成されます。それにもかかわらず、私たちは通常これらをチェックインするので、ソースコードをチェックアウトする人は誰でもビルドして実行できる完全なバージョンを持っています。 (たとえば、xmlをデシリアライズするためのxsdファイルから作成されたクラスを参照してください。)

これらのファイルも同じように表示します。これらは、ツールを介して生成されたC#ソースコードですが、プログラムのビルドに必要です。したがって、チェックインしてください。

7
Yamikuronue

生成されたファイルに変更がない場合は、それらをバージョン管理に入れても意味がありません。コンパイルされたバイナリもバージョン管理に入れませんか?バージョン管理の基本的なルールは、他のファイルから生成できるものをバージョン管理に置く必要がないことです。もちろん、生成がどういうわけか複雑であるか、時間がかかる場合、それは実用的ではないかもしれません。

5
simoraman

The Pragmatic Programmer の呼び出しパッシブコード生成を参照しているようです。

パッシブコードジェネレーターはタイピングを節約します。 [...]結果が生成されると、それはプロジェクトの本格的なソースファイルになります。他のファイルと同じように、編集、コンパイル、およびソース管理下に置かれます。

用途:

  • 新しいソースファイルの作成
  • プログラミング言語間で1回限りの変換を実行する
  • 実行時の計算にコストがかかるルックアップテーブルやその他のリソースの作成

生成されたソースファイルを次のいずれかに配置します。

  • 生成されたC#コードを変更する場合
  • 開発環境で実行する前にコードを生成する必要がないようにする場合は、例えば。生成を行うためにツールをインストールする必要がある場合
  • 生成プロセスが長い場合
5
Mike Partridge