2016-12-02 48 views
0

我有一个包含在NMakeBuildCommandLine部分明确的Windows shell命令的vcxproj文件:代码重用文件的存在测试在Visual Studio中vcxproj文件

<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> 
move file1 file2 
</NMakeBuildCommandLine> 

我使用的MSBuild执行vcxproj,直接或通过sln文件。问题是,当file1不存在,输出是非常无益的,甚至没有列出该文件的名称:

The system cannot find the file specified. 

我天真的解决方案是,以取代move file1 file2

if exist file1 (move file1 file2) else (echo file1 does not exist &amp;&amp; exit 1) 

(注我需要写&amp;&amp;而不是&&。)

这工作,但因为我需要在每行file1三次,并确保他们的所有比赛是容易出错。 file1只是需要移动的许多文件之一。而且,各种构建配置中的一系列命令实际上是相同的。

如何避免这两个命令行内和跨构建配置重复自己?我认为UserMacros属性组可能会帮助我,但我无法弄清楚如何通过IDE编写这样的宏。 (右键单击Visual Studio中的项目不会显示用于输入用户宏的字段。)我也无法在Internet上找到关于此部分语法的任何讨论,所以我不知道如何使用文本编辑器(我真的更喜欢)。

在vcxproj文件中可能还有一种更好的方法来识别需要存在的文件,所以我对任何选择都是开放的。

+1

可能是最好的开始查找如何使用属性MSBuild的。在文本编辑器中打开vcxproj,将 path/to/file添加到PropertyGroup,然后使用'if exists $(file1)...'? – stijn

+0

@stijn,这是我正在寻找的信息。有用。如果你把它作为答案,我会upvote它和(除非有更好的出现)选择它。谢谢! – Alan

回答

1

与大多数其他编程语言properties一样,MsBuild具有“变量”。您在项目文件xml中的PropertyGroup元素中声明一个元素,然后使用$(PropertyName)语法重新使用它。为您的案例:

<PropertyGroup> 
    <Src>/path/to/my/src</Src> 
    <Dst>/path/to/my/dst</Dst> 
</PropertyGroup> 

<NMakeBuildCommandLine> 
if exist $(Src) (move $(Src) $(Dst)) else (echo $(Src) does not exist &amp;&amp; exit 1) 
</NMakeBuildCommandLine> 

如果你想使用的IDE,如果你有很多的值可能变得单调而乏味,你的确可以使用所谓的UserMacros但你必须声明那些在proprty片。转到视图 - >物业经理,右键单击您的项目,然后选择“添加新的物业表”。双击它,进入“用户宏”并在那里添加键/值对。如果保存所有内容并查看生成的文件,现在可以看到vcxproj导入propertysheet,而属性表本身具有PropertyGroup,就像上面显示的那样 - 但是可以通过IDE进行编辑。

作为一种可能更好(减少重复,更容易自动化)的替代方案,您可以使用MsBuild代码来检查文件存在和移动文件,这有益于您只需编写移动命令一次可以有MsBuild loop超过items。这些是在ItemGroup中声明的。这里解释一切是有点出入的范围,但一个例子应该把事情说清楚:

<Target Name="BatchMove"> 
    <ItemGroup> 
    <SrcFiles Include="file1"> 
     <Dest>file2</Dest> 
    </SrcFiles> 
    <SrcFiles Include="file3"> 
     <Dest>file4</Dest> 
    </SrcFiles> 
    </ItemGroup> 
    <Warning Text="Source file %(SrcFiles.Identity) does not exist" Condition="!Exists(%(SrcFiles.Identity))" /> 
    <Move SourceFiles="%(SrcFiles.Identity)" DestinationFiles="%(SrcFiles.Dest)" Condition="Exists(%(SrcFiles.Identity))" /> 
</Target> 

这声明2的源文件文件1 /文件3和它们各自的目标文件的文件2 /文件4。如果源不存在(使用标准的MsBuild Exists检查),则会显示一条消息,否则会将其移至目标。这些%字符将使它们出现的行循环遍历SrcFiles集合的每个元素。要添加更多文件,只需添加到ItemGroup。最后一步是让这个目标从通过调用文件本身的MSBuild并告诉它运行目标做简单的NMAKE命令行调用:

<NMakeBuildCommandLine> 
msbuild $(MSBuildThisFile) /t:BatchMove 
</NMakeBuildCommandLine> 
相关问题