从this answer应用建议的更改后,我的构建服务器无法构建受影响的解决方案。
问题是.NET 4.0和.NET 4.5项目是在彼此之后编译的。
作为一个例子,假设我有4个项目:a.csproj
,b.csproj
,c.csproj
。所有项目都有.NET 4.0和.NET 4.5版本,这意味着我a.csproj
,a_40.csproj
,b.csproj
,b_40.csproj
,c.csproj
和{ {1}}。其中一些项目依赖于解决方案中的另一个项目。例如,c_40.csproj
取决于b*.csproj
。此外,a*.csproj
和a.csproj
的输出库名称相同:a_40.csproj
。
现在,不是采取理智的方式并编译所有4.0程序集,然后编译所有4.5程序集,TFS像往常一样,选择疯狂的方式并以完全随机的顺序构建所有内容,同时为所有项目使用相同的输出文件夹。当然失败了。
我想这个问题至少有两个解决方案:
问题:我不知道该怎么做。
我的问题:有人可以告诉我如何使我的两个建议的解决方案中的任何一个工作或向我展示这个问题的另一个解决方案吗?
答案 0 :(得分:1)
找到解决方案:https://stackoverflow.com/a/1027551/937093
通过向所有受影响的解决方案添加两个构建配置(一个用于构建.NET 4项目,一个用于构建.NET 4.5项目)并在TFS中创建两个构建定义,我得到的东西就像我想要的那样。
答案 1 :(得分:-1)
我没有使用TFS作为构建机器(我更喜欢Jenkins或其他CI工具),但所有服务器都允许您创建自己的MSBuild脚本来进行构建。 .csproj是一个MSBuild脚本。
如果您创建自己的脚本,则可以设置首选订单。无论如何,使用.sln通常可以正确地解决依赖关系。
如果您想深入了解MSBuild,请查看参考资料:http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx
示例脚本如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TextToSay>This is a property</TextToSay>
</PropertyGroup>
<ItemGroup>
<Binaries Include="$(MSBuildProjectDirectory)\..\MSBuildTests\**\*.dll" />
</ItemGroup>
<UsingTask TaskName="GenerateDumbFiles" AssemblyFile="$(MSBuildProjectDirectory)\..\MSBuildTests\MSBuildTests.Tasks\bin\Debug\MSBuildTests.Tasks.dll" />
<Target Name="SaySomething">
<Message Text="$(TextToSay)" />
</Target>
<Target Name="Build">
<Delete Files="@(Binaries)" />
<MSBuild Projects="$(MSBuildProjectDirectory)\..\MSBuildTests\MSBuildTests.sln" />
<MakeDir Directories="$(MSBuildProjectDirectory)\..\dumbfiles" />
<GenerateDumbFiles Directory="$(MSBuildProjectDirectory)\..\dumbfiles" Prefix="DumbFile" Count="100" />
</Target>
<Target Name="TransformLog">
<XslTransformation XmlInputPaths="$(MSBuildProjectDirectory)\msbuild-output.xml" XslInputPath="$(MSBuildProjectDirectory)\msbuild.xsl" OutputPaths="$(MSBuildProjectDirectory)\log.html" />
</Target>
MSBuild任务用于编译.NET中的东西。