バージョン管理には、アプリケーションのビルドに必要なコードと構成が含まれている必要があります。
この意味は:
短期間に導入された一時的なもの(バグの場所を特定するため、または言語の機能を試すために必要な時間など)は、バージョン管理に入れないでください。必要になるまで保管してくださいそれから、commitを実行するときに単に削除します。
特定のマシンに適切なローカルファイルは、ブランチに保持される場合があります。
ラップトップが盗まれたり、ウイルスによってOSを再インストールする必要がある場合、これらすべてをやり直すのは非常に苦痛なので(そして、ところで、最後のバックアップは2年前に行われたことがわかります) 。
一方、ファイル構造には注意してください。圧倒的になるまでlocal configはOKであり、プロジェクトに参加している42人の開発者全員のすべてのファイルで1つの変更を強制します。
マシン間の特性を削除する機会に注意してください。以下を意味する場合があります。
開発者のマシン上のローカルインスタンスを置き換えるために、dev SQLサーバーへのアクセスを許可します。
Pypiやnpmなどのパッケージ配布サービスをパブリックパッケージに使用し、プライベートパッケージを社内パッケージに使用すると、
チームのメンバーに同じバージョンのソフトウェアをインストールするよう依頼し、
ソフトウェアの更新を可能な限り透過的に行い、
または、ワンクリックでOSと必要なソフトウェアをマシンに展開できるようにします(さらに、すべての開発者が好みのVim対Emacs、Chrome対Firefoxなどをインストールする時間)
そう:
プロジェクトファイル。現在のPCのレイアウトを反映するために、パスを編集する必要がある場合があります。
すべてのPCで同じレイアウトを使用しないのはなぜですか?プロジェクト内のパスは、プロジェクトファイルに相対的である必要があります。つまり、プロジェクトの場所は問題ではありません。ソフトウェアとライブラリのバージョンは、一部のマシンでのみ表示される不可解なバグを回避するために同じである方がよく、チームの他のメンバーのために再現することは不可能です。
例:
Visual Studioで作成されたプロジェクトには、次のものがあります。
ファイル自体。パスは相対的であり、私のマシン上でプロジェクトが存在するかどうかは関係ありませんH:\Development\Hello World Project\
が、チームの他のメンバーはプロジェクトをチェックアウトしC:\Work\HelloWorld\
ます。
依存関係、つまりサードパーティおよび社内のライブラリ。どちらのタイプもNuGetで処理する必要があります。これにより、すべての競合関連の議論が廃止されます。私が持っているライブラリと同じバージョンを持っていない場合は、NuGetに依存関係を更新するよう依頼してください。それと同じくらい簡単です(うまく機能する場合、常にそうであるとは限りません)。
社内ライブラリをプライベートNuGetに保持することも重要です。多数のライブラリを共有フォルダーに保存したり、チーム間で電子メールで送信したりすると、無秩序で憂鬱なCIサーバーにつながります。
設定。チームが同じ設定を共有することが重要です。チームの半分が警告をエラーとして扱い、チームの半分が警告をそのまま保持することにした場合、チームの最初の部分のメンバーは、チームの2番目の部分から開発者が生成した警告を削除することに時間を費やします。
ユーティリティ関連の設定。チームの一部のメンバーがいくつかのユーティリティをインストールしている場合とそうでない場合があるため、これらは注意が必要です。
同じツールセットをインストールすることを強くお勧めします。一部のプログラマがStyleCopを使用したいが、他のプログラマは使用しない場合、チームは仕事を完了できません。コード契約を使用するものと使用しないものがある場合、同じ問題が発生します。
メイクファイル。たとえば、デバッグ中は最適化をオフにする必要がありますが、CIサーバーはオフにする必要はありません。
バージョン管理でいくつかのメイクファイルを保持します。CIサーバーでデバッグバージョンをビルドし、それをクライアントにプッシュして、厄介なバグが発生することも珍しくありません。
汚いいハッキング。たとえば、関数に応じて何かをテストするために、関数の途中で7を返し、値7でブレークする疑いがあります。
私はそもそもそのようなコードを避けるでしょう。何かをテストするには、単体テストを使用します。デバッグのためにコードを入れ替えるのに本当に数秒かかる場合、それを行いますが、とにかく数分でこのコードを削除するので、コミットする必要はありません。
それを説明するとき、テストを書く必要があります。たとえば、次のことを確認したい場合:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
定数にtemperature
劣ると例外をスローAbsoluteZero
します。コード自体で遊んではいけません。代わりに、次のことを行うユニットテストを作成します。
- コードを自己文書化する、
- コードの信頼性を高め、
- 上記の方法を変更するとき、メンテナーが回帰テストに依存できることを確認します。
- 同じテストを行う必要のあるチームの他の開発者にサービスを提供します。