Build 如何补偿开发机器和构建服务器之间的环境差异?

Build 如何补偿开发机器和构建服务器之间的环境差异?,build,nunit,continuous-integration,Build,Nunit,Continuous Integration,我已经在我的机器上安装了NUnit“C:\Program Files\NUnit 2.4.8\”,但在我的集成服务器(运行CruiseControl.Net)上,我已经在“D:\Program Files\NUnit 2.4.8\”中安装了它。问题是,在我的开发计算机上,我的NAnt生成文件工作正常,因为在任务中,我使用路径“C:\Program Files\NUnit 2.4.8\bin\NUnit.Framework.dll”来添加对“NUnit.Framework.dll”程序集的引用,但

我已经在我的机器上安装了NUnit“C:\Program Files\NUnit 2.4.8\”,但在我的集成服务器(运行CruiseControl.Net)上,我已经在“D:\Program Files\NUnit 2.4.8\”中安装了它。问题是,在我的开发计算机上,我的NAnt生成文件工作正常,因为在任务中,我使用路径“C:\Program Files\NUnit 2.4.8\bin\NUnit.Framework.dll”来添加对“NUnit.Framework.dll”程序集的引用,但同一生成文件无法在我的集成服务器上生成该文件(因为引用路径不同)。我是否必须将NUnit安装在集成服务器中的同一位置?这个解决方案对我来说似乎太严格了。有更好的吗?这类问题的一般解决方案是什么?

通常我会将NUnit和任何其他依赖项与我的项目一起分发到某个公共位置(对我来说,它是顶层的libs目录)


然后,我只引用应用程序中的那些LIB,它们相对于项目解决方案始终位于同一位置。

我将使用两种方法:

1) 使用具有不同路径的两个不同的登台脚本(开发构建/集成构建)


2) 将所有需要的可执行文件放在path文件夹中,并直接调用它们

通常,应避免依赖绝对路径。就CI而言,您应该能够完全从scatch使用源代码管理中通过自动脚本找到的资源在干净的机器上构建和运行您的解决方案。

最终解决方案可以是将整个工具链存储在源代码管理中,以及存储您在源代码管理中构建的任何库/二进制文件。如果设置正确,这可以确保您能够从任何时间点完全按照发布时的样子重新生成任何版本,但是,此外,您不需要这样做,因为您生成的每个二进制文件都是源代码控制的


然而,达到这一点是一项严肃的工作。

我同意绝对路径是邪恶的。如果您无法绕过它们,至少可以在脚本中设置默认为C:。。。在CI服务器中,在命令行中调用传入NUNIT_HOME属性的脚本

或者,您可以将脚本设置为需要设置NUNIT_HOME环境变量才能使NUNIT工作。现在,您的脚本要求nUnit在环境变量中存在并可用,而不是要求它所运行的机器在某个确切位置具有nUnit


这两种方法都允许您在不修改构建脚本的情况下更改正在使用的nunit的版本,这是您想要的吗?

将工具链中的所有工具置于版本控制之下的想法是一个好主意。但是在您的路径上,您可以使用两种不同的技术为每台机器指定不同的路径

让我们告诉您,您可以使用
-Dname=value
进行覆盖。您可以使用它为您的开发计算机设置一个默认位置,并在CI系统中覆盖该位置


您还可以使用获取环境变量的值来更改每台机器的位置。

这正是我所做的,只是我的“libs”目录被称为“lib”(与旧的unix标准保持一致)。这还有一个额外的好处,就是简化了开发人员的转换——任何开发人员都可以选择您的项目并开始工作,而无需安装大量的依赖项。实际上,我刚才也查看了我的名为“lib”的项目,Unix肯定是我选择它的地方。可移植性是这样做的一个很好的理由。我可以对一个项目进行签出,然后直接构建它,而不需要任何额外的安装。
/MyApp
  /libs
    /NUnit
    /NAnt
    /etc...
  /src
    /etc...