2011-06-29 21 views
2

私はexecを呼び出してwixセットアッププロジェクトをビルドする必要があります。私は、私は混乱していないにできるだけ単純に限り試してみたmsbuild execタスクコールmsbuild

<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)" /> 

は現在、私は私のTFSbuild.projに以下のいるところ」であることを意味している。私はこれを実行すると、デバッグメッセージ(第二最後のコマンド)の出力

"MSBuildの" "/ P:設定:" リリース "" " /P:DefineConstants:" WEBROOT = \サーバー\は\アプリ\ Installerが\最新のビルドの低下\ x86 \ Release_PublishedWebsites \ Web; DBRoot = \ server \ drops \ app \ Installerビルド\ Latest \ x86 \ Release \ Database "" "F:\は\ Installerが\ BuildType \セットアップ\のSetup.slnのビルド\アプリのビルド"

を私は

' "MSBuildのは"' として認識されていないログに次のエラーを取得します 内部または外部コマンド
操作可能なプログラムまたはバッチファイルです。 fは:\は\アプリの\インストーラを構築 ビルド\ BuildType \ TFSBuild.proj(538,5): エラーMSB3073:コマンド "" MSBuildの " "/ P:設定:" リリース """ /P:DefineConstants "最新の\ x86 \リリース\データベース" "f:\ builds \ WebServer \ Drops \ App \インストーラビルド\ Latest \ x86 \ Release_PublishedWebsites \ Web; DBRoot =アプリ\インストーラ ビルドの\ BuildType \セットアップ\のSetup.sln「」 が、これはコマンドラインからMSBuildのコマンドを呼び出すことができないことで引き起こされている場合9009

私はよく分からないコードで終了しました私はmsbuildをコマンドlから呼び出せないのでこのように、私はそれを参照しようとすると、それを指すプロパティがありますか?

+0

私は何かが間に合わないかもしれませんが、[MSBuild Task](http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx)を追加するのではなく、なぜMSBuildを 'Exec'する必要がありますか? – Filburt

答えて

1

まず、引用符の大部分は必要ありません。特に使用しているパスに空白が含まれていない場合は、これをトリムして、$(ウェブルート)は、$(DBROOT)と$(MSBuildProjectDirectory):MSBuildのパスが指定されていないので、

<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のを実行することはできません。通常、$(WINDIR)\ Framework \ Microsoft.Net \ v4.0.30319フォルダにあります。これを得るにはいくつかの方法があります。直接エンコードするか、何らかの設定が必要な環境変数を使用するか、あらかじめ定義された$(MSBuildBinPath)を使用するか、MSBuildレジストリ構文を使用してレジストリから展開します。次のようになります。あなたがExecの使用のMSBuildを実行しているだけではなく、のMSBuildタスクを使用している理由

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

しかし、それは明らかではありません。これにExecでの行を変更します。

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

<設定>のためのあなたの宣言を削除し、これに<DefineConstants>を変更:

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

定数を定義することは、私が実際にオーバーライドする必要があるプロパティそのもののリストであり、msbuildタスクはこれを処理できないようです... http://stackoverflow.com/questions/506687/defining-multiple-values-in-defineconstants- in-msbuild-elementです。答えをありがとう! –

+0

私はmsfs 3.5を使用していると思うtfs 2008を使用しているので、そこに提案された回避策を使用することはできないと思いますか? execタスクで4.0 msbuildを呼び出すとしても、それを実行するmsbuildは3.5になると思いますか?しかし、間違っている可能性があります! –

+0

3.5を使用している場合、パスはv4.0.30319ではなくv3.5になり、レジストリパスは4.0ではなく3.5になりますが、それ以外の場合は同じになります。 MSBuildは、Condition = "'$(DefineConstants)' == ''"のような条件を使用するだけで、DefineConstantsを構成する個々のプロパティまたは値全体をオーバーライドすることができ、そのプロパティが既に値を持っている場合はスキップされます。 –

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ソリューションと一緒に設定プロパティと追加のプロパティを保持するようになります。

+0

DefineConstantsは実際にはその中に定義されたプロパティのリストを持つプロパティだと思うので、追加のプロパティは動作しません。 –

+0

@Danielコードサンプルのように 'DefineConstants'をラップすることは可能です。 – Filburt