2008-08-28 58 views
4

我刚刚使用继承的属性表为我们现有的C++代码建立了一个不合适的构建系统,这个功能似乎是特定于Visual C++产品的。不适当的建筑需要改变许多项目设置,并且继承的属性页允许我通过将属性表附加到项目来更改所有必要的设置。我正在将我们的团队从用于UI的C++/MFC迁移到C#和WPF,但我需要提供相同的不适合的构建功能,希望能够提供相同的便利。我似乎无法找到一种方法来处理C#项目 - 我首先查看了是否可以引用MsBuild目标文件,但找不到方法来执行此操作。我知道我可以在整个事情上使用MsBuild,但这似乎比必要的更复杂。有没有一种方法可以为目录定义一个宏,并在输出路径中使用它,例如?使用C#编写不合适的版本

回答

3

我不太确定什么是“不适用”构建系统,但是如果您只需要将编译文件(或其他资源)复制到其他目录的功能,您可以通过绑定到MSBuild构建目标。

在我们的项目中,我们将编译的DLL移动到lib文件夹中,并在构建完成后将文件放入适当的位置。为此,我们创建了一个自定义构建.target文件,该文件创建了TargetPropertyItemGroup,然后我们使用该文件填充我们的外部输出文件夹。

我们的定制目标文件看起来有点像这样:

<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中,最后将我们的自定义构建目标DeleteLibFilesCopyLibFiles绑定到构建过程中。我们为我们的解决方案中的每个项目设置了这一点,以便只更新的文件被删除/复制,并且每个项目都负责它自己的文件(dll,图像等)。

我希望这会有所帮助。我很抱歉,如果我误解了你的意思是不适当的构建系统,这对你来说完全没用!

0

有没有一种方法,我可以定义一个宏的目录,并在输出路径

你看着在预构建和生成后一个项目的事件使用它?

0

实际上,预生成和生成后事件似乎只是一个添加批处理文件类型命令的地方。这不利于我为我们的项目建立标准的构建目录。并且让这些事件创建批处理文件对于像C#,IMO这样的现代语言来说似乎是一种非常1980年的方法。

挖掘更多内容并进行实验后,我发现您可以将一个<导入>指令添加到.csproj文件中。当你这样做时,IDE会弹出一个警告对话框,提示项目中存在一个不安全的入口点 - 但是你可以忽略这一点,显然,你可以通过编辑一个注册表项使它完全不出现。所以这会给我一种方法来获取包含我需要的目录路径的变量到.csproj文件中。

现在得到输出路径来引用它 - 不幸的是,当你在输出路径字段中添加一个像“$(MySpecialPath)/ Debug”这样的字符串并保存项目时,$和()字符被转换为十六进制,并且您的文件将放入名为“$(MySpecialPath)”的目录下的Debug目录中。 Arrgghh。如果您在文本编辑器中编辑.csproj文件,则可以正确设置它,但只要标签出现在包含输出路径的<PropertyGroup>之前,它似乎就可以工作。

所以我认为我的解决方案将创建一个标准的OurTeam.targets MsBuild文件在一个标准的位置,添加一个安装程序更改注册表,因此它不会标记警告,然后创建自定义项目模板<导入>此文件,并将输出路径设置为使用OurTeam.targets文件中定义的属性。不幸的是,这比C++中的属性表继承机制更加出色并且不太优雅。