使用 Git 时如何避免在我的代码中使用绝对路径名?

How do I avoid absolute pathnames in my code when using Git?

到目前为止,在我的编程生涯中,我主要从事小型项目,直接在 Linux 开发主机上编辑 PHP/Perl/Python 文件,然后将文件复制到同一目录将它们推入生产环境的实时服务器。

我现在正尝试通过学习如何使用 Git 以及如何正确 编写代码 并牢记 Git 来设置它。我想了解此场景的最佳实践:

这里有一个名为 "BigFun" 的项目,它也使用了一些库来处理许多项目共有的任务。

/home/projects/BigFun/bin/script1.pl
/home/projects/BigFun/bin/script2.pl
/home/projects/BigFun/bin/script3.pl
/home/projects/BigFun/lib/FunMaker.pm

/home/projects/common/lib/Utilities.pm
/home/projects/common/lib/Format.pm

如果这个程序不是由 Git 管理的,并且我知道这些文件永远不会被移动,我可以这样做:

#!/usr/bin/perl
use warnings;
use strict;
use lib '/home/projects/BigFun/lib';
use FunMaker;
use lib '/home/projects/common/lib';
use Utilities;

但是一旦这由 Git 管理,那么任何人都可以检出这些文件并将它们放在自己的开发中 space。如果您的开发根目录是 "C:\My Projects\BigFun".

,硬编码的 URL 将不再有效

所以,一些问题:

  1. 我大概可以假设 BigFun "lib" 目录将始终相对于 "bin" 目录。所以也许我可以将第 3 行更改为 use lib '../lib'; 。不过,这是正确的解决方案吗?

  2. 不过,我列出的这个示例代码似乎有可能分成 两个 存储库 - 一个用于 BigFun,另一个作为一个 "common" 存储库,其中包含许多项目使用的一些工具。当发生这种情况时,在我看来,BigFun 代码将无法知道在哪里可以找到 "common" 库。 /home/projects/common/lib 完全不能保证有效,../../common/lib 也不会。 Git 处理此类事情的正常方法是什么?

我正在研究 "Pro Git" 这本书,但我(还)没有找到任何东西来回答这些问题。感谢任何能给我指出正确方向的人!

您的问题与 Git 无关, 这是关于合作。 绝对路径迫使您的软件的所有用户使用相同的目录布局,这是不可接受的。没有像样的软件可以做到这一点。 在软件中避免绝对路径是规范, 无论您使用或不使用什么版本控制系统。

如何让您的软件使用严格的相对路径而不是绝对路径来工作?那要看software/framework/language了。 为了使相对路径有意义, 你需要考虑这个问题:从哪里来的亲戚? 这里有一些想法作为 锚点 可以从中考虑相对路径:

  • 当前工作目录
  • 用户主目录
  • 包安装目录
  • 框架安装目录

每种语言通常都有一些打包机制。 打包的目标是该语言的开发人员可以创建一个标准包,其内容的组织方式使得该语言的标准工具可以安装它, 将软件添加到该语言的系统范围的库中, 或自定义用户库, 或到指定的图书馆位置。 安装软件后,从标准包中, 它可以像任何其他已安装的软件一样使用。

在你的例子中, use warnings;use strict; 无需任何设置即可工作,因为这些库已安装在系统中。 系统找到它们相对于 Perl 安装目录的位置。粗略地说。

所以你需要做的是:

  1. 找出如何打包 Perl 库
  2. 了解如何安装 Perl 包

一旦您的 FunMakerUtilities 作为标准 Perl 包安装,您将能够将您的脚本简化为:

#!/usr/bin/perl
use warnings;
use strict;
use FunMaker;
use Utilities;

您当然必须记录脚本的依赖关系 (FunMaker, Utilities), 以及如何安装它们(尤其是这些包的托管位置)。