2012-01-24 25 views
6

什么是用于定义调试/发布目标输出文件夹中的最佳实践:它是更好地有单独的文件夹用于调试/发布或我应该使用这两个同一个文件夹(当使用。 NET/C#)?使用.NET(C#)时调试/发布输出的单独或相同的文件夹?

我有两个独立的解决方案,因此一个解决方案的项目不能通过项目引用另一个解决方案的项目。所以你不得不直接添加一个对程序集文件的引用。 这会导致另一个问题:如果通过文件添加对另一个程序集的引用,则只能为调试和一个发布版本添加一个而不是一个(就像您可以使用C++中的库一样)。另一个问题是,我必须添加一个引用,例如,bin/版本/MyOtherProject/MyAssembly.dll。我认为这很混乱,特别是在构建Debug和引用Release时。 =>构建错误和版本冲突可能会发生。

有没有人在大型项目和环境中构建到同一个目标文件夹的经验?

这是一个更精确的问题,涉及堆栈溢出问题Should we still make a difference between the release and debug output folders?

+5

VS自动创建单独的目录。 –

+0

...但是,如果您添加对另一个程序集的引用,则只能添加一个而不是一个用于调试和一个发行版。如果我有几个解决方案(目前取决于平台),我必须添加一个参考,例如bin/Release/MyOtherProject/MyAssembly.dll。我认为这很混乱,特别是在构建Debug和引用Release时。 =>构建错误和版本冲突可能发生 – Beachwalker

+2

如果您正在同时开发其他程序集,那么该项目应该是一个解决方案的一部分。这两种方式都在相同的配置(调试或发布)一起编译。如果另一个程序集是一个单独的尝试,那么我会使用发布版本,以便调试版本不会滑入您的发布项目文件中的其他项目。 –

回答

5

我们一直在使用相同的目录在.NET应用程序中进行调试和发布10年,并且从未遇到过问题。

这种方法使大量任务变得相当容易,比如构建安装,将自定义DLL文件复制到构建后目录以及在输出目录中对版本文件进行版本控制,例如开发人员正确运行应用程序所必需的许可证文件。

4

如果它们是两种不同的解决方案,我不明白为什么要引用调试输出。事实上,我认为你不应该在其他项目目录中引用输出。如果代码移动到另一台机器,并且您不能完美地复制项目结构,则可能会破坏您的参考。

我认为最好的做法是要么

1)最好在项目一个lib目录/解决您手动复制项目/解决方案B的输出做,如果你不更改项目B常常。

2)把两个项目放在同一个解决方案中,然后添加一个对项目的引用。请记住,您可以在多个解决方案中拥有一个项目。如果您在同一时间开发两个项目,请执行此操作。

+2

正确,如果项目A在源代码管理(TFS)下项目A和项目B在源代码管理项目B下,则可以同时检入A和B从一个解决方案,这是相当不错的。 – John

+0

从我的角度来看,发布输出不应该包含调试符号(无论是内部还是作为pdb文件)。一个选项可能是在安装过程中删除pdb文件作为后期构建步骤。 – Beachwalker

+0

我们目前拥有太多的项目文件(程序集,可通过弹簧进行动态加载和交换),将它们构建在一个解决方案中。当解决方案很大时,VS + Resharper变得非常缓慢。因此,有一个解决方案不是一种选择(请参阅顶部的评论)。另一个原因是外部组件直接进入存储库和CI应该与当前/最新的开发相协调(解决这个问题的一个选择是将单元测试与交付解耦,但是这会花费在api更改期间更改单元测试)。 – Beachwalker

4

如果您有两个相关的项目,您对它们处于相同的目标类型和配置(这意味着它不是您使用的某个第三方包)时足够关心 - 您最好将它们放在相同的解决方案中。

如果你因为某些原因不能不能,还有另一个(有点丑陋)的解决方案。

您可以根据目标编辑您的.csproj和“动态”引用程序集。在.csproj文件中,引用位于名为“ItemGroup”的XML元素中。在每个项目组中,您有许多“引用”元素,并且组件的路径位于“提示”元素中。你可以在提示中放置$(Configuration)变量。例如:

<ItemGroup> 
    <Reference Include="your assembly"> 
     <HintPath>..\..\$(Configuration)\blabla.dll</HintPath> 
    </Reference> 
</ItemGroup> 

这样,目录名称将包含配置名称(他们应该是匹配 - 这意味着,如果你改变了你的名字破事)。

另一种选择是定义三个完全不同项目组,并使用“条件”属性:

  1. 物品组没有条件是将使用参考系统,的System.Xml等
  2. 属性为Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "的项目组将包含将在调试配置中使用的引用。
  3. 对于发布配置,属性为" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "的项目组。

在每个项目组中,您将引用正确配置中的程序集。

这有点难看,因为.csproj有时会自动修改,再加上你可以很容易地忘记和弄出来。但无论如何,它会起作用。

+0

$变量表达式的使用在Visual C++项目中工作得很好(或说出色),我自己也使用过它们。但是,在VS中使用VS的C#项目中存在一个问题,即无法使用ui输入这些变量(就像在C++项目中所做的那样)。就个人而言,我不喜欢使用IDE无法表达的内容,需要在更改后手动编辑文件。尽管如此,你的建议正在起作用,并成为解决问题的一种方法。谢谢。 – Beachwalker

相关问题