我有2个解决方案(比如Master Framework M和Slave Project 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用于不同目的
我不想维护2个csproj文件,一个引用构建过程的所有DLL,另一个引用开发项目的引用&amp; CI目的。
我的两个主要想法是: 1)保留2个不同的解决方案并在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。
我想让这更容易,也许更聪明
答案 0 :(得分:1)
你应该考虑设计。在第一时间,您将节省编译过程的时间,但稍后您将花费更多时间修复您的主人以适应所有奴隶。
通常您希望每次更改时都生成Master(M)。想象一下你改变M以便它有一个S1的新功能,一切正常。一段时间后,您尝试编译S2,根据您对S1所做的更改获得异常。
为避免此问题,您通常使用版本号,以确保p.e. S1适用于M版本1.0,S2适用于M版本1.1。当然,您希望您的Master项目始终与所有版本兼容,但这很难维护,如果更改最多只有一个Slave,您会很高兴投射一段时间。
使用postbuild事件,您可以应用一些将输出复制到其他项目的代码。我曾经使用过一次但在一个项目中。使用多种解决方案,您无法确定路径是否适合其他计算机。
<强>更新强>
此外,我发现这篇文章很好地解释了解决方案管理:
http://msdn.microsoft.com/en-us/library/ee817674.aspx
答案 1 :(得分:1)
我会代表第一次解决方案:
在M解决方案中,使用 PostBuild事件在某个位置复制最新的构建二进制文件。 S项目通过引用它们来消耗这些二进制文件,就像项目中的DLL一样。
通过这种方式,一次重建M,所有S项目都将引用最新版本的M。