4

カスタム .msbuild ファイルを実行する CruiseControl.NET から Team Build 2010 にビルドを切り替えようとしています。コンパイルされているアプリケーションは、多数のプロジェクトを含む VS2008 ソリューションであり、そのうちの 2 つは Web プロジェクトです。

DefaultTemplate.xaml を使用すると、2 つの Web プロジェクトが にデプロイされているように見えますBinaries\_PublishedWebsites\(ProjectName)。そのデフォルトの場所は問題ありません。ただし、出力ディレクトリの内容は、aspnet_compiler.exeで呼び出されたかのように-u、または MSBuild<AspNetCompiler>タスクが で使用されたかのように、更新可能であるように見えますUpdateable="true"。だから、2つの質問:

  1. チーム ビルドで更新不可能な出力を_PublishedWebsitesディレクトリに生成するにはどうすればよいですか?
  2. MSBuild タスクで次のことを行っているかのように、IIS VirtualPath を設定するにはどうすればよいですか。

    <AspNetCompiler Clean="true" Force="true" VirtualPath="/My-IIS-Virtual-Path" />
    

以前のトラブルシューティングで、更新不可モードでコンパイルされた Web サービスを IIS 6 に提供させる唯一の方法はaspnet_compiler.exe、コマンドで仮想パスを指定することであることがわかりました。そのため、#2 について尋ねています。

編集:

これまでの 1 つの回答を見て、問題が何であるかをもっと明確にする必要があることに気付きました。MSBuild で何かを行うことができれば、ビルド テンプレートから MSBuild を呼び出すだけでよいことに気付きました。_PublishedWebsitesただし、出力をディレクトリにコピーするために何が起こるかをどのように変更するかについて、もう少し疑問に思っています。「Web サイトをコピーして変更するタスクを見つけてください」はうまく機能しますが、実際に出力を にコピーしているものがわからない点が異なります_PublishedWebsites。私が本当にやりたいことは、これを実現するテンプレートのステップを変更することです。

ビルド ログ_CopyWebApplicationは、Web アプリケーションに必要なファイルをコピーする作業を行うように見える というコンパイル ターゲットを参照します。ただし、ビルド テンプレートやソリューション内のファイルのどこにも表示されないため、このコンパイル ターゲットを変更する方法がわかりません。さらに、何を_CopyWebApplication実行しても、ソリューション内の他の多くのプロジェクトではなく、Web アプリケーション プロジェクトに対してのみ実行されているように見えます。これは良いことですが、 を使用するかどうかを決定するロジックがどこにあるかわからないことを除けば_CopyWebApplication.

たぶん、私が見逃しているデフォルトの MSBuild ファイルがいくつかありますか? 使用できるビルドパラメーターはありますか? 前述のビルドステップを変更するにはどうすればよいですか?

4

3 に答える 3

4

ターゲットのすべてのロジックは、次の_CopyWebApplication場所で定義されています。

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets

ターゲット自体はかなり単純ですが、いくつかの前提条件があります。

<Target Name="_CopyWebApplication" 
        Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'" 
        DependsOnTargets="$(_CopyWebApplicationDependsOn)">

  <CallTarget Condition="'$(OnAfter_CopyWebApplication)' != ''" Targets="$(OnAfter_CopyWebApplication)" RunEachTargetSeparately="true" />

</Target>

目的のフラグのセットに到達したら、プロセスを制御できます。デフォルトは次のとおりです。

<WebProjectOutputDirInsideProjectDefault>True</WebProjectOutputDirInsideProjectDefault>
<WebProjectOutputDirInsideProjectDefault  Condition="('$(OutDir)' != '$(OutputPath)') Or ('$(IsDesktopBuild)' == 'False')" >False</WebProjectOutputDirInsideProjectDefault>
<DisableLinkInCopyWebApplicaton Condition="'$(DisableLinkInCopyWebApplicaton)'==''">False</DisableLinkInCopyWebApplicaton>
<Disable_CopyWebApplication Condition="'$(Disable_CopyWebApplication)' == ''">False</Disable_CopyWebApplication>
<UseWPP_CopyWebApplication Condition="'$(UseWPP_CopyWebApplication)' == ''">False</UseWPP_CopyWebApplication>
<CleanWebProjectOutputDir>True</CleanWebProjectOutputDir>
<CleanWebProjectOutputDir Condition="$(WebProjectOutputDirInsideProject)" >False</CleanWebProjectOutputDir>
于 2012-03-01T21:03:45.480 に答える
4

KMoraz は私に正しい方向を示してくれました。これを機能させるには、さらにいくつかのことをしなければなりませんでした。ビルトイン ファイルを編集したくはありませんでした。編集すると、後で、.targets私が何をしたかを知らない他の開発者にメンテナンスの問題が発生するからです。.csproj最終的に、2 つの Web アプリケーションのファイルを次のように編集しました。ファイル<Import>の末尾近くにある既定の要素から始めて、既定の要素の前で終了します<ProjectExtensions>

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <!-- Since this Import serves no real purpose in VS2008 under Team Build, I'm commenting it out to remove
       a _CopyWebApplication step that we don't want.
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
  -->
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
  <!-- Now, for Team Build, do the AspNetCompile steps ourselves. -->
  <PropertyGroup>
      <WebProjectOutputDir Condition="'$(OutDir)' != '$(OutputPath)'">$(OutDir)_CompiledWebsites\$(MSBuildProjectName)</WebProjectOutputDir>
  </PropertyGroup>
  <PropertyGroup>
      <BuildDependsOn>
          $(BuildDependsOn);
          DoAspNetCompile
      </BuildDependsOn>
  </PropertyGroup>
  <Target Name="DoAspNetCompile" Condition="'$(CompileWebsites)' == 'True' And '$(OutDir)' != '$(OutputPath)'">
      <Message Text="Performing AspNetCompile step for $(MSBuildProjectName)" />
      <Message Text="Output will have IIS virtual directory '$(IISVirtualPath)'" />
      <Message Text="ProjectDir is $(ProjectDir)" />
      <Message Text="IsDebug is $(IsDebug)" />
      <RemoveDir Directories="$(WebProjectOutputDir)" ContinueOnError="true" />
      <MakeDir Directories="$(WebProjectOutputDir)" />
      <!-- We need the /bin directory, populated with some DLLs and PDBs -->
      <CreateItem Include="$(OutDir)*.dll;$(OutDir)*.pdb">
          <Output TaskParameter="Include" ItemName="BinariesToCopy" />
      </CreateItem>
      <Copy DestinationFolder="$(ProjectDir)\bin" SourceFiles="@(BinariesToCopy)" />
      <AspNetCompiler Clean="True" Force="True" Debug="$(IsDebug)" Updateable="False" VirtualPath="$(IISVirtualPath)" PhysicalPath="$(ProjectDir)" TargetPath="$(WebProjectOutputDir)" />
  </Target>

いくつかの説明:

  1. .csprojご覧のとおり、デフォルトで使用されていることがファイルに記載C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targetsされています。.targets以前は、MSBuild がそのファイルを使用する方法を知っていたことに気づきませんでした。VS2008でターゲットファイルの_CopyWebApplicationターゲットを使用しない唯一の方法はファイルを使用しないことであり、VS2010バージョンも実際には役に立たなかったため、インポートをコメントアウトしました。
  2. 出力をデフォルトと区別するために、出力ディレクトリの名前_CompiledWebsites_PublishedWebsites.
  3. <BuildDependsOn>拡張ポイントを変更する他のプロジェクト ファイルがターゲットを無効にしないように、この要素を追加しました。
  4. CompileWebsitestrue に設定する必要があります ( /p:CompileWebsites=trueMSBuild に渡されるパラメーターのようなものを使用しますが、必要に応じてチーム ビルド内でこれを達成する他の方法もあります)。そうすれば、デフォルトのローカル ビルドは影響を受けません。
  5. <Message>要素はデバッグ用です。ファイルの上部にある設定$(IsDebug)で True または False に設定しました。通常の「Debug」と「Release」以外にも多くの構成があるためAspNetCompiler、デバッグ シンボルを含めるかどうかを判断できるように、このフラグが必要でした。 $(IISVirtualPath)ファイルの上部近くの構成にも設定されています。IIS 6 がこの方法でコンパイルされた Web サービスを提供するために必要です。
  6. AspNetCompilerチームビルドがデフォルトで配置するプリコンパイル済みバイナリを見つけることができないため、それらをbin\プロジェクトのディレクトリにコピーしAspNetCompilerます。
  7. これを機能させるために、チーム ビルドの .xaml テンプレートで特別なことをする必要はありませんでした。ビルド定義に/p:CompileWebsites=Trueパラメーターが含まれていることを確認する必要がありました。これを行うには、チーム エクスプローラー ウィンドウ (チーム プロジェクトの [ビルド] の下) でビルド定義を右クリックし、[プロセス] をクリックして、[3. 詳細設定] エントリを展開し、[ /p:CompileWebsites=TrueMSBuild Arguments] というラベルの付いた行に入力します。

このビルド構成を必要とするプロジェクトが 2 つ以上ある場合は、おそらくDoAspNetCompileターゲットを含むファイルを作成し、そのファイルをインポートします。

于 2012-03-07T20:47:34.310 に答える
2

TFS 2010 ビルドの DefaultTemplate.xaml は引き続き MSBuild を使用してプロジェクトをビルドするため、リストされている 2 つのことを MSBuild.exe で実行できる場合は、2010 ビルド プロセスで実行できます。必要な作業は、必要な MSBuild 引数をビルド定義のプロセス パラメーターに追加することだけです。ビルド定義の更新の詳細については、MSDNを参照してください。

于 2012-02-23T20:19:09.327 に答える