ここで答えが見つかりました:http:
//www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010には、ボタンをクリックするだけでWebアプリプロジェクトを簡単に公開できる、優れた新しいWebアプリケーションプロジェクト公開機能があります。舞台裏では、Web.configの変換とパッケージの構築は、プロジェクトファイル(C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoftにあります)にインポートされた大規模なMSBuildスクリプトによって実行されます。 .Web.Publishing.targets)。残念ながら、スクリプトは非常に複雑で、乱雑で、文書化されていません(それ以外の場合、ファイル内のスペルが間違っていて、ほとんど役に立たないコメントがいくつかあります)。そのファイルの大きなフローチャートとそれにフックする方法に関するいくつかのドキュメントは素晴らしいでしょうが、悲しいことに欠けているようです(または少なくとも私はそれを見つけることができません)。
残念ながら、これは、コマンドラインを介して公開を実行することが必要以上に不透明であることを意味します。最近では多くのショップが継続的インテグレーションサーバーを使用しており、自動展開(VS2010パブリッシング機能が大いに役立つ可能性がある)を行っているショップもあるため、この分野のドキュメントが不足していることに驚きました。これを有効にすると考えたでしょう(簡単に!)この機能のかなり主要な要件でした。
とにかく、Microsoft.Web.Publishing.targetsファイルを何時間も掘り下げて、試行錯誤の壁に頭をぶつけた後、VisualStudioが「ファイルシステムに公開」をクリックするだけで魔法のように見えることを理解できました。および「BuildDeploymentPackage」機能。MSBuildのスクリプトについて少し説明しますので、MSBuildに慣れていない場合は、このクラッシュコースのMSDNページを確認することをお勧めします。
ファイルシステムに公開
VS2010の[ファイルシステムに公開]ダイアログ[ファイルシステムに公開]は、MSBuildの適切な使用が行われることを期待していたため、理解するのに少し時間がかかりました。代わりに、VS2010は非常に奇妙なことをします。MSBuildを呼び出して、プロジェクトのobjフォルダー内のWebアプリのファイルを準備する一種のハーフデプロイを実行し、それらのファイルの手動コピーを実行するようです(つまり、MSBuildの外部)。ターゲットの公開フォルダーに移動します。MSBuildはファイル(およびその他のビルド関連のもの)をコピーするように設計されているため、これは実際には奇抜な動作です。したがって、プロセス全体が、VS2010が呼び出した1つのMSBuildターゲットであり、ターゲットではなく手動コピーである場合は意味があります。
これは、コマンドラインでMSBuildを介してこれを行うことは、特定のターゲットを使用してプロジェクトファイルを呼び出し、いくつかのプロパティを設定するほど簡単ではないことを意味します。VS2010が実行すべきことを実行する必要があります。つまり、ハーフデプロイを実行するターゲットを自分で作成し、その結果をターゲットフォルダーにコピーします。プロジェクトファイルを編集するには、VS2010でプロジェクトを右クリックし、[プロジェクトのアンロード]をクリックしてから、もう一度右クリックして[編集]をクリックします。WebアプリケーションターゲットをインポートするImport要素が見つかるまで下にスクロールします(Microsoft.WebApplication.targets。このファイル自体が前述のMicrosoft.Web.Publishing.targetsファイルをインポートします)。この行の下に、PublishToFileSystemという新しいターゲットを追加します。
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
このターゲットは、手動コピーを実行する前にVS2010が呼び出すPipelinePreDeployCopyAllFilesToOneFolderターゲットに依存します。Microsoft.Web.Publishing.targetsを調べてみると、このターゲットを呼び出すと、プロジェクトファイルがプロパティ_PackageTempDirで指定されたディレクトリに配置されることがわかります。
ターゲットで最初に呼び出すタスクはErrorタスクです。このタスクには、PublishDestinationプロパティが設定されていない場合にのみタスクが発生することを保証する条件が設定されています。これにより、PublishDestinationプロパティの指定を忘れた場合に、ビルドがエラーになります。次に、MakeDirタスクを呼び出して、そのPublishDestinationディレクトリがまだ存在しない場合は作成します。
次に、_PackageTempDirフォルダーの下にあるすべてのファイルを表すPublishFilesというアイテムを定義します。次に、コピータスクが呼び出され、これらすべてのファイルが発行先フォルダーにコピーされます。Copy要素のDestinationFiles属性は少し複雑です。アイテムの変換を実行し、それらのパスをPublishDestinationフォルダーをルートとする新しいパスに変換します(これらの%()の意味については、既知のアイテムのメタデータを確認してください)。
コマンドラインからこのターゲットを呼び出すには、次のコマンドを実行するだけです(プロジェクトファイル名とプロパティを自分に合わせて変更することは明らかです)。
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
下位互換性のために、withの条件付きインポートが存在します。VS2010では、偽の状態のためにスキップされた場合でも、このインポートが存在する必要があります。もう一度見ると、csprojには$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
、現在のバージョンのVisualStudioのターゲットファイルに解決される別のインポートが含まれていることがわかります。