我需要调用exec并构建一个wix安装项目。
目前我的TFSbuild.proj
中有以下内容 <PropertyGroup>
<WebRoot>$(DropLocation)\Latest\x86\Release\_PublishedWebsites\Web</WebRoot>
<DBRoot>$(DropLocation)\Latest\x86\Release\Database</DBRoot>
</PropertyGroup>
<PropertyGroup>
<Msbuildexe>"msbuild"</Msbuildexe>
<Configuration>"/p:Configuration:"Release""</Configuration>
<DefineConstants>" /p:DefineConstants:"WebRoot=$(WebRoot);DBRoot=$(DBRoot)""</DefineConstants>
<WixSolution>"$(MSBuildProjectDirectory)\Setup\Setup.sln"</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,我会怎样才能去引用它,是否有一个指向它的属性?
答案 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:"WebRoot=$(WebRoot);DBRoot=$(DBRoot)"</DefineConstants>
<WixSolution>"$(MSBuildProjectDirectory)\Setup\Setup.sln"</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解决方案一起保留。