我刚刚使用继承的属性表为现有的C代码设置了一个不合适的构建系统,这个特性似乎是Visual C产品特有的.构建不合适需要更改许多项目设置,并且继承的属性表允许我仅通过将属性表附加到项目来更改所有必需的设置.我正在将我们的团队从用于UI的C / MFC迁移到C#和WPF,但我需要提供相同的异地构建功能,希望具有相同的便利性.我似乎无法通过C#项目找到一种方法 – 我首先查看是否可以引用MsBuild目标文件,但找不到这样做的方法.我知道我可以直接使用MsBuild,但这似乎比必要的更复杂.有没有办法可以为目录定义宏并在输出路径中使用它,例如?
解决方法:
我不太确定什么是“不合适”的构建系统,但是如果你只需要能够将编译的文件(或其他资源)复制到其他目录,你可以通过绑定到MSBuild构建目标来实现这一点. .
在我们的项目中,我们将已编译的dll移动到lib文件夹中,并在构建完成后将文件放入适当的位置.为此,我们创建了一个自定义构建.target文件,用于创建Target,Property和ItemGroup,然后我们用它来填充外部输出文件夹.
我们的自定义目标文件看起来有点像这样:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectName>TheProject</ProjectName>
<ProjectDepthPath>..\..\</ProjectDepthPath>
<ProjectsLibFolder>..\..\lib\</ProjectsLibFolder>
<LibFolder>$(ProjectsLibFolder)$(ProjectName)\$(Configuration)\</LibFolder>
</PropertyGroup>
<Target Name="DeleteLibFiles">
<Delete Files="@(LibFiles-> '$(ProjectDepthPath)$(LibFolder)%(filename)%(extension)')" TreatErrorsAsWarnings="true" />
</Target>
<Target Name="CopyLibFiles">
<Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ProjectDepthPath)$(LibFolder)" SkipUnchangedFiles="True" />
</Target>
<ItemGroup>
<LibFiles Include=" ">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
</Project>
然后,Visual Studio中的.csproj文件与此自定义目标文件集成:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" ... >
...
<Import Project="..\..\..\..\build\OurBuildTargets.targets" />
<ItemGroup>
<LibFiles Include="$(OutputPath)$(AssemblyName).dll">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
<Target Name="BeforeClean" DependsOnTargets="DeleteLibFiles" />
<Target Name="AfterBuild" DependsOnTargets="CopyLibFiles" />
</Project>
简而言之,这个构建脚本首先告诉MSBuild加载我们的自定义构建脚本,然后将编译后的文件添加到LibFiles ItemGroup,最后将我们的自定义构建目标DeleteLibFiles和CopyLibFiles绑定到构建过程中.我们在解决方案中为每个项目设置了这个,所以只有更新的文件被删除/复制,每个项目都负责它自己的文件(dll,图像等).
我希望这有帮助.如果我误解了你的异地构建系统是什么意思,我很抱歉,这对你来说完全没用!