msbuild exec任务调用msbuild

时间:2011-06-29 04:45:34

标签: msbuild parameters exec

我需要调用exec并构建一个wix安装项目。

目前我的TFSbuild.proj

中有以下内容
 <PropertyGroup>
      <WebRoot>$(DropLocation)\Latest\x86\Release\_PublishedWebsites\Web</WebRoot> 
      <DBRoot>$(DropLocation)\Latest\x86\Release\Database</DBRoot> 
    </PropertyGroup>

 <PropertyGroup>
      <Msbuildexe>&quot;msbuild&quot;</Msbuildexe>
      <Configuration>&quot;/p:Configuration:&quot;Release&quot;&quot;</Configuration>
      <DefineConstants>&quot; /p:DefineConstants:&quot;WebRoot=$(WebRoot);DBRoot=$(DBRoot)&quot;&quot;</DefineConstants>
      <WixSolution>&quot;$(MSBuildProjectDirectory)\Setup\Setup.sln&quot;</WixSolution>
    </PropertyGroup>

    <Message Text="Bulding setup solution" />
    <Message Text="$(Msbuildexe) $(Configuration) $(DefineConstants) $(WixSolution)" />
    <Exec Command="$(Msbuildexe) $(Configuration) $(DefineConstants) $(WixSolution)" />

我尽可能地尝试了,所以我不会感到困惑的地方是“我的意思是。当我运行这个调试消息(第二个最后一个命令)输出

  

“的msbuild”   “/ p:配置:”发布“”“   / p:DefineConstants:“WebRoot = \ server \ drops \ _ \ Installer Build \ Latest \ x86 \ Release_PublishedWebsites \ Web; DBRoot = \ server \ drops \ app \ Installer Build \ Latest \ x86 \ Release \ Database”“   “f:\ builds \ app \ Installer Build \ BuildType \ Setup \ Setup.sln”

我在日志中收到以下错误

  

'“msbuild”'未被识别为   内部或外部命令,
  可操作程序或批处理文件。   F:\建立\程序\安装   建立\ BuildType \ TFSBuild.proj(538,5):   错误MSB3073:命令“”msbuild“   “/ p:配置:”发布“”“   / p:DefineConstants:“WebRoot = \ server \ drops \ _ \ Installer Build \ Latest \ x86 \ Release_PublishedWebsites \ Web; DBRoot = \ server \ drops \ app \ Installer Build \ Latest \ x86 \ Release \ Database”“   “F:\建立\程序\安装   建立\ BuildType \ SETUP \ Setup.sln “”   退出代码9009。

我不确定这是不是因为无法从命令行调用msbuild命令或“问题。如果是因为我无法从命令行调用msbuild,我会怎样才能去引用它,是否有一个指向它的属性?

2 个答案:

答案 0 :(得分:1)

首先,您不需要大多数引号,特别是如果您使用的路径不包含空格,但我会将其修剪为此,允许路径中的空格为$(WebRoot ),$(DbRoot)和$(MSBuildProjectDirectory):

<PropertyGroup>
   <WebRoot>$(DropLocation)\Latest\x86\Release\_PublishedWebsites\Web</WebRoot>
   <DBRoot>$(DropLocation)\Latest\x86\Release\Database</DBRoot>
</PropertyGroup>
<PropertyGroup>
   <MsbuildExe>{still-needs-a-path-to}\msbuild</MsbuildExe>
   <Configuration>/p:Configuration:Release</Configuration>
   <DefineConstants>/p:DefineConstants:&quot;WebRoot=$(WebRoot);DBRoot=$(DBRoot)&quot;</DefineConstants>
   <WixSolution>&quot;$(MSBuildProjectDirectory)\Setup\Setup.sln&quot;</WixSolution>
</PropertyGroup>
<Message
   Text="Bulding setup solution"
   />
<Message
   Text="$(MsbuildExe) $(Configuration) $(DefineConstants) $(WixSolution)"
   />
<Exec
   Command="$(MsbuildExe) $(Configuration) $(DefineConstants) $(WixSolution)"
   />

但是,您仍然无法使用此方法执行MSBuild,因为未指定MSBuild的路径。它通常位于$(WINDIR)\ Framework \ Microsoft.Net \ v4.0.30319文件夹中。有几种方法可以实现这一点,或者直接编码,依赖环境变量(必须以某种方式设置),使用预定义的$(MSBuildBinPath),或者使用MSBuild注册表语法从注册表中提取它。看起来像这样:

$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\MSBuildToolsPath)

但是,目前尚不清楚为什么使用Exec运行MSBuild而不仅仅是使用MSBuild任务。将Exec的行更改为:

<MSBuild
   Project="$(WixSolution)"
   Properties="$(DefineConstants)"
   />

删除&lt; Configuration&gt;的声明和更改&lt; DefineConstants&gt;对此:

   <DefineConstants>Configuration=$(Configuration);WebRoot=$(WebRoot);DBRoot=$(DBRoot)</DefineConstants>

答案 1 :(得分:0)

跟进我的评论,我建议您尝试使用MSBuild任务代替Exec

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="BuildWiXSolution">
    <!-- Include the custom build targets installed with WiX -->
    <Import Project="$(MSBuildExtensionsPath)\Wix\Wix.targets"/>

    <PropertyGroup>
        <WebRoot>$(DropLocation)\Latest\x86\Release\_PublishedWebsites\Web</WebRoot> 
        <DBRoot>$(DropLocation)\Latest\x86\Release\Database</DBRoot> 
    </PropertyGroup>

    <ItemGroup>
        <WiXSolution Include="$(MSBuildProjectDirectory)\Setup\Setup.sln">
            <Properties>Configuration=Release</Properties>
            <AdditionalProperties>WebRoot=$(WebRoot);DBRoot=$(DBRoot)</AdditionalProperties>
        </WiXSolution>
    </ItemGroup>

    <Target Name="BuildWiXSolution">
        <MSBuild Projects="@(WiXSolution)" />
    </Target>  
</Project>

它允许您将配置属性和其他属性与Wix解决方案一起保留。