VS 2010解决方案取决于其他解决方案

本文关键字:解决方案 其他 取决于 VS 2010 | 更新日期: 2023-09-27 18:27:47

我有两个解决方案(比如说主框架M和从项目S)。M被许多S类解所使用。在我的构建过程中,我从M构建所有DLL,然后在S中使用它们。在工作时,我想要一个更快的周期,在那里我可以很容易地修改M并立即在S.中使用

您可能知道的问题都与csproj文件中引用库或项目的方式有关。

如果你想链接一个DLL,你必须做这样的

<Reference>
  <HintPath>..'lib'$(Platform)'$(Configuration)'M.Example.dll</HintPath>
</Reference>

如果你想链接一个项目(甚至从另一个解决方案),你必须这样做

<ProjectReference Include="..'path to project in other solution'M.Example.csproj">
  <Project>{2009D1C4-E18F-6CF8-8AA4-B53A1B2F1009}</Project>
  <Name>M.Example</Name>
</ProjectReference>

这是直接写在C#项目(csproj)文件中的!所以你不能在同一个文件中使用不同目的的项目或DLL

我不想维护两个csproj文件,一个引用构建过程的所有DLL,另一个引用开发&CI目的。

我的两个主要想法是:1) 留下两个不同的解决方案并在M中工作,然后构建并在S中工作,仅引用DLL并使用自定义输入项目(仅在开发中),该项目将在M中生成的DLL复制到S的lib目录中,这样S就可以使用它们,而无需在S根目录之外查看或引用其他项目。

2) 使用类似的条件

<Reference Condition='$(BUILDING)!=""'>
  <HintPath>..'lib'$(Platform)'$(Configuration)'M.Example.dll</HintPath>
</Reference>
<ProjectReference Condition='$(BUILDING)==""' Include="..'path to project in other solution'M.Example.csproj">
  <Project>{2009D1C4-E18F-6CF8-8AA4-B53A1B2F1009}</Project>
  <Name>M.Example</Name>
</ProjectReference>

其中BUILDING仅在正式构建过程中定义。

我想让这变得更容易,也许更智能

VS 2010解决方案取决于其他解决方案

我支持第一个解决方案:

在您的M解决方案中,使用PostBuild事件在某个位置复制最新的构建二进制文件。S项目通过像项目中的DLL一样引用二进制文件来使用这些二进制文件。

通过这种方式,每次重建M时,所有的S项目都将引用最新版本的M。

您应该考虑一下设计。在最初的时刻,您将节省编译过程的时间,但稍后您将花费更多时间来修复Master以适应所有Slave。

通常你想在每次更改Master(M)时生成它。想象一下,你更改M,使其具有S1的新功能,并且一切正常。一段时间后,您尝试编译S2,并根据您为S1所做的对M的更改获得异常。

为了避免这个问题,你通常使用版本号,以确保p.e.S1与M的1.0版兼容,S2与M的1.1版兼容。当然,你希望你的主项目始终与所有版本兼容,但这可能很难维护,如果一次更改最多阻止一个从项目,你会很高兴。

使用后生成事件,您可以应用一些代码将您的输出复制到其他项目。我在一个项目中使用过一次。有了多种解决方案,你无法确定这条路径是否适合其他机器。

更新:
此外,我发现这篇文章很好地解释了解决方案管理:
http://msdn.microsoft.com/en-us/library/ee817674.aspx