我对使用 git 很陌生,以前并没有真正尝试过“组织”我从事的任何项目。然而,我最近刚刚购买了一个供个人使用的开发服务器,我想开始组织我的所有项目并使用版本控制。
在过去的 8 个小时里,我研究了在项目中组织文件的不同推荐方法,我意识到这是一个非常主观的问题。但是,我开发了一个系统,我认为该系统几乎适用于我的任何原因,关于如何使用目录结构完成某项任务,我有一个非常客观的问题。
目前,我正在研究类似于以下内容的结构:
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 个冗余副本
- 我希望能够从我的其他项目中提取这些依赖项(一个项目应该能够作为单独项目的库)
我可以通过使用虚拟目录(符号链接)来避免同一文件的 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 文件中,但如果项目是,比如说,一个网站 - 这可能意味着数百个文件会在我的存储库根目录中混乱。
如何将另一个存储库作为我自己的库包含在内,在我自己的项目中轻松引用库文件,将库有意义地复制给获取我的存储库的任何人,并防止在我的开发服务器上重复复制相同的文件?
编辑:在谷歌上搜索了一段时间后,我发现了这个类似的问题,但它只涉及 PHP 项目。虽然自动加载器可能允许您在 PHP 环境中屏蔽底层文件系统,但您将如何将类似的方法应用于 C++ 项目?还是 Python 项目?还是 Java 项目?
当我今天更多地考虑这个项目时,我想到了一些其他的想法,这可能需要一个新的思路方向。首先是非常深的库嵌套问题。如果项目 A 依赖于项目 B,而项目 B 又依赖于项目 C,而项目 C 又依赖于项目 D,那么您将具有如下目录结构:
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 仓库时是如何处理依赖关系的?