1

プロジェクトのコンパイル時に Visual Studio 2008 で使用される msbuild のバージョンを変更することはできますか?

msbuild 4.0を使用するように設定したいと思います。

これの背後にある理由は、ナゲット パッケージの復元のために VS2012 プロジェクトで使用されるのと同じ .targets ファイルをインポートできるようにするためです。プロジェクトはスマート デバイス プロジェクトであるため、VS10+ にアップグレードできません。

元のターゲット ファイルを手動で編集しようとしましたが、msbuild 3.5 には欠落している機能が多すぎて、それらを回避できませんでした。

アップデート:

元の .targets ファイルも nuget.exe ファイルの自動ダウンロード機能を使用しており、MSBuild 3.5 ではサポートされていないコード タスクを使用しているため、これは考慮する必要があります。

4

1 に答える 1

2

Visual Studio からコンパイルする場合、msbuild の代わりに devenv を使用しています。devenv が msbuild をどのように呼び出すかを確認できれば素晴らしいと思います (ただし、VS は非オープン ソース ツールであるため、できません)。ですから、それができるとは思えません。たぶん、あなたがやろうとしていることをするための別のアプローチがあります。

MSbuild v3.5 は、MSbuild 4.0 のように動的なタスクの作成をサポートしていませんが、カスタマイズされたタスクを作成してインポートすることができます。

最初に、nuget.exe (nuget.targets から取得) をダウンロードするタスクを含む単純なクラス ライブラリ (私は DownloadNuget2008.dll と呼びます) を作成します。

using System;
using System.IO;
using System.Net;
using Microsoft.Build.Utilities;

namespace DownloadNuget2008
{
    public class DownloadNuget2008Task : Task
    {
        public string OutputFilename { get; set; }

        public override bool Execute()
        {
            try
            {
                OutputFilename = Path.GetFullPath(OutputFilename);

                Log.LogMessage("Downloading latest version of NuGet.exe...");
                var webClient = new WebClient();
                webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

                return true;
            }
            catch (Exception ex)
            {
                Log.LogErrorFromException(ex);
                return false;
            }
        }
    }
}

以前は、以下の Exec タスクを使用して Visual Studio 2008 で NuGet パッケージを復元していました (csproj/vbproj を編集します)。

  <UsingTask AssemblyFile="$(SolutionDir)DownloadNuget2008.dll" TaskName="DownloadNuget2008Task" />
  <!-- Download NuGet.exe if it does not already exist -->
  <PropertyGroup>
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(SolutionDir)nuget.exe</NuGetExePath>
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
  </PropertyGroup>
  <Target Name="_DownloadNuGet">
    <Message Text="Downloading nuget..." />
    <DownloadNuget2008Task OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" />
    <Message Text="Downloading nuget - done." />
  </Target>
  <!-- NuGet Packages Installation (Begin)  -->
  <Target Name="Install-Packages">
    <Exec Command="$(SolutionDir)nuget install $(ProjectDir)packages.config -o $(SolutionDir)packages" />
  </Target>
  <!-- NuGet Packages Installation (End)  -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <CallTarget Targets="_DownloadNuGet" />
    <CallTarget Targets="Install-Packages" />
  </Target>

次に、出力に次のように表示されます。

Target BeforeBuild:
  Task "CallTarget"
    Target "_CheckForInvalidConfigurationAndPlatform" skipped. Previously built successfully.
    Target _DownloadNuGet:
      Task "Message"
        Downloading nuget...
      Done executing task "Message".
      Using "DownloadNuget2008Task" task from assembly "C:\marcos\Testes\NuGet2008\ConsoleApplication1\DownloadNuget2008.dll".
      Task "DownloadNuget2008Task"
        Downloading latest version of NuGet.exe...
      Done executing task "DownloadNuget2008Task".
      Task "Message"
        Downloading nuget - done.
      Done executing task "Message".
  Done executing task "CallTarget".
  Task "CallTarget"
    Target "_CheckForInvalidConfigurationAndPlatform" skipped. Previously built successfully.
    Target Install-Packages:
      Task "Exec"
        Command:
        C:\marcos\Testes\NuGet2008\ConsoleApplication1\nuget install C:\marcos\Testes\NuGet2008\ConsoleApplication1\ConsoleApplication1\packages.config -o C:\marcos\Testes\NuGet2008\ConsoleApplication1\packages
        Successfully installed 'elmah 1.2.2'.
      Done executing task "Exec".
  Done executing task "CallTarget".

VS2012 と VS2008 の両方で同じ .targets ファイルを使用したいということは理解していますが、(あなたが言ったように) MSBuild 3.5 と 4.0 には多くの違いがあるため、特定のアプローチの方が簡単です。

于 2013-01-30T14:11:44.583 に答える