私は git を使い始めたばかりで、これまで取り組んできたプロジェクトを実際に「整理」しようとしたことはありませんでした。しかし、最近個人用の開発サーバーを購入したばかりで、すべてのプロジェクトを整理し、バージョン管理を使用したいと考えていました。
過去 8 時間かけて、プロジェクト内のファイルを整理するためのさまざまな推奨方法を調査しましたが、それは非常に主観的な問題であることがわかりました。しかし、私は自分にとってほぼすべての原因で機能すると思われるシステムを開発しました。ディレクトリ構造で特定のタスクを達成する方法に関して、非常に客観的な質問が 1 つあります。
現在、私は次のような構造を検討しています。
src/ - All deliverables in an uncompiled form (PHP files, c source files, etc)
data/ - Crucial but unrelated data (SQL databases, etc.)
lib/ - Dependencies -- THIS IS WHERE MY QUESTION LIES
docs/ - Documentation
build/ - Scripts to aide in the build process
test/ - Unit tests
res/ - Not version controlled. Contains PSD files and non-diff-able stuff
.gitignore
README
output.zip - Ready-to-install finished product (just unzip and go)
前述したように、私の本当の問題はこのlib/
ディレクトリを中心に展開しています。これには、プロジェクトで実行する必要があるすべてのファイルとプログラムを含める必要がありますが、これらはプロジェクトの範囲外であり、編集しません。このフォルダに必要ないくつかの機能:
- これらは最終製品を実行するために必要なので、output.zip に含める必要があります。
- このフォルダーをバージョン管理して、git リポジトリをダウンロードした人がすべての依存関係にアクセスできるようにしたいと考えています。
- 複数のプロジェクトに同じ依存関係がある場合、サーバー上に同じファイルの 18 個の冗長コピーを保持したくありません
- これらの依存関係を私の他のプロジェクトから取得できるようにしたいと思います (1 つのプロジェクトが別のプロジェクトのライブラリとして機能できる必要があります)。
仮想ディレクトリ(シンボリックリンク)を使用することで、同じファイルの18個の冗長コピーを回避できますが、私の理解では、gitはファイルをコピーせずにこのシンボリックリンクをそのままリポジトリにコピーします。したがって、他の誰かが私のリポジトリを取得した場合、ダングリング ポインターがあり、ライブラリがありません。
最初は、 git-submoduleを使用してやりたいことができるように見えました。ただし、私の理解では、これは別のリポジトリのコンテンツ全体を取得し、それをサブディレクトリとして扱います。したがって、「依存関係 A」を含めた場合、ライブラリ フォルダーは次のようになります。
/lib/A/src/
/lib/A/data/
...
/lib/A/test/
.gitignore
README
output.zip
スクリプト (PHP、Perl など) の場合、おそらく を使用して依存関係を読み込むことができますrequire('lib/A/src/dependency.php')
が、DLL またはバイナリ ファイルの場合、output.zip から出力ファイルを読み取る簡単な方法はありません。完成したプロジェクトをきれいな zip ファイルにまとめるのではなく、ルート レベルに直接保存することもできますが、プロジェクトがたとえば Web サイトの場合、何百ものファイルがリポジトリ ルートに散らかってしまう可能性があります。
別のリポジトリを自分のライブラリとして含め、自分のプロジェクト内のライブラリ ファイルを簡単に参照し、自分のリポジトリをフェッチする人にライブラリを意味のある形でコピーし、開発サーバーで同じファイルの重複コピーを防ぐにはどうすればよいですか?
編集:Googleでしばらく検索した後、この同様の問題が見つかりましたが、PHPプロジェクトのみに対応しています。オートローダを使用すると、PHP 環境で基盤となるファイル システムをマスクできますが、同様のアプローチを C++ プロジェクトにどのように適用しますか? それとも Python プロジェクトですか? それともJavaプロジェクトですか?
今日このプロジェクトについてもっと考えてみると、新しい方向性が必要かもしれない他のいくつかの考えが頭に浮かびました。1 つ目は、ライブラリの入れ子が非常に深いという問題です。プロジェクト A が、プロジェクト D に依存するプロジェクト C に依存するプロジェクト B に依存している場合、ディレクトリ構造は次のようになります。
A/lib/
A/lib/B/
A/lib/B/lib/
A/lib/B/lib/C/
A/lib/B/lib/C/lib/
A/lib/B/lib/C/lib/D/
明らかに、これは迷惑になるだけでなく、それ自体が冗長になります。
通常の人は、git リポジトリを実行するときに依存関係をどのように処理しますか?