4

次のように、powershell から MSBuild を使用して、Web アプリケーション プロジェクトを含むソリューションを構築します。

msbuild "/p:OutDir=$build_dir\" $solution_file

32 ビットでは問題なく動作しますが、64 ビット マシンでは次のエラーが発生します。

エラー MSB4019: インポートされたプロジェクト "C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" が見つかりませんでした。宣言内のパスが正しいこと、およびファイルがディスク上に存在することを確認してください。

Visual Studio 2008 と powershell v2 を使用しています。この問題はすでにここここに文書化されています。基本的に、VS の 64 ビット インストールでは、MSBuild に必要な Microsoft.WebApplication.targets は、Program Files ディレクトリではなく、Program Files(x86) ディレクトリにありますが、MSBuild はこれを認識しないため、間違った場所に表示されます。

これまでに私が持っている2つのソリューションは理想的ではありません:

  1. 64 ビットのファイルを Program Files (x86) から Program Files に手動でコピーします。これは貧弱な解決策です。すべての開発者がこれを手動で行う必要があります。
  2. csproj ファイルを手動で編集して、MSBuild が適切な場所に表示されるようにします。繰り返しますが、理想的ではありません。新しいプロジェクトごとに 64 ビットの全員が csproj ファイルを手動で編集する必要はありません。

例えば

<Import Project="$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)" Condition="Exists('$(MSBuildExtensionsPathx86)\$(WebAppTargetsSuffix)')" />

理想的には、コマンド ラインから適切な場所からターゲット ファイルをインポートするように MSBuild に指示する方法が必要ですが、その方法がわかりません。解決策はありますか?

4

2 に答える 2

2

他にもいくつかの選択肢があります。

MSBuild は基本的に環境変数を使用して動作するため、msbuild を開始する前にいつでも Program Files を ProgramFiles (x86) に変更できます。

$env:ProgramFiles = ${env:ProgramFiles(x86)}

これにより、MSBuild が適切な場所を検索するようになります。

考えられるもう 1 つの方法は、Start-Job を使用してスクリプト内から MSBuild を実行することです。これは、より一般的な回避策です。

Start-Job {
   Import-Module YourProject
   Start-YourMsBuildProject
} -RunAs32

お役に立てれば

于 2010-03-26T19:06:47.440 に答える
1

これは、32 ビット プロンプトから msbuild を実行する場合 64 ビット マシンで変更を加えることなく動作するはずです。このテスト ファイルを指定すると、次のようになります。

<Project 
   DefaultTargets="Test" 
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
   ToolsVersion="3.5">

  <Target Name="Test">
    <Message text="$(MSBuildExtensionsPath)"/>
  </Target>
</Project>

x64 システムの 32 ビット PowerShell プロンプトから次の結果が得られます。

PS> msbuild test.proj /nologo
Build started 3/26/2010 9:13:10 AM.
Project "C:\temp\test.proj" on node 0 (default targets).
  C:\Program Files (x86)\MSBuild
Done Building Project "C:\temp\test.proj" (default targets).

VS は 32 ビット アプリであるため、VS から直接実行する場合も、これは問題になりません。

于 2010-03-26T15:14:17.507 に答える