web-dev-qa-db-ja.com

msbuildを使用してファイルシステム公開プロファイルを実行する

VS2010で作成され、VS2012でアクセスされるようになったc#.Net 4.0プロジェクトがあります。

このWebサイトから目的の場所に必要なファイルのみを公開しようとしています(C:\ builds\MyProject [Files])

私のファイル構造: ./ProjectRoot/MyProject.csproj ./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

MSBuildで以下を実行しています:

C:\ Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj/p:DeployOnBuild = true /p:PublishProfile=./ProjectRoot/Properties/PublishProfiles/FileSystemDebug.pubxml

これはFileSystemDebug.pubxmlのxmlです

<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

結果の動作は次のとおりです。

  • ここでZipファイルが作成されます:./ ProjectRoot/obj/Debug/Package/MyProject.Zip
  • <publishUrl>C:\builds\MyProject\</publishUrl> WTFには何もデプロイされていません
  • 作成されるZipファイルは豚の朝食であり、アプリケーションに不要なファイルがいっぱいです。

Visual Studioでこの公開プロファイルを実行すると、フォルダーが*C:\ builds\MyProject *に作成され、必要な正確なアーティファクトが含まれます。

Msbuildからこの単純な結果を取得するにはどうすればよいですか?

78
P. Roe

参考:Visual Studio 2015でも同じ問題が発生しました。何時間も試してみた後、msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofileを実行できるようになりました。

.csprojファイルを編集して機能させる必要がありました。次のような行が含まれていました。

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

この行を次のように変更しました。

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />

(10.0を14.0に変更しました。これが必要かどうかはわかりませんが、条件部分は必ず削除する必要がありました。)

42
johanv

ここで答えを見つけました: 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ファイルを何時間も掘り下げて、試行錯誤の壁に頭を突っ込んだ後、Visual Studioがどのように魔法のワンクリック「ファイルシステムに発行」を実行するように見えるかを理解することができました。 「Deploy Deployment Package」機能。 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>

このターゲットはPipelinePreDeployCopyAllFilesToOneFolderターゲットに依存します。これは、VS2010が手動コピーを行う前に呼び出すものです。 Microsoft.Web.Publishing.targetsを調べてみると、このターゲットを呼び出すと、プロジェクトファイルがプロパティ_PackageTempDirで指定されたディレクトリに配置されることがわかります。

ターゲットで最初に呼び出すタスクはエラータスクです。このタスクには、PublishDestinationプロパティが設定されていない場合にのみタスクが発生することを保証する条件が設定されています。これにより、PublishDestinationプロパティを指定するのを忘れた場合に、キャッチされ、ビルドがエラーになります。次に、MakeDirタスクを呼び出して、PublishDestinationディレクトリが存在しない場合は作成します。

次に、_PackageTempDirフォルダーの下にあるすべてのファイルを表すPublishFilesというアイテムを定義します。次に、コピータスクが呼び出され、これらのすべてのファイルが発行先フォルダーにコピーされます。 Copy要素のDestinationFiles属性は少し複雑です。アイテムの変換を実行し、それらのパスをPublishDestinationフォルダーをルートとする新しいパスに変換します(%()sの意味を確認するには、既知のアイテムメタデータを確認してください)。

コマンドラインからこのターゲットを呼び出すには、次のコマンドを実行するだけです(明らかにプロジェクトファイル名とプロパティを自分に合わせて変更します)。

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
39
P. Roe

上記のすべての回答を試した後もまだ問題がありました(Visual Studio 2013を使用しています)。発行フォルダーに何もコピーされませんでした。

問題は、ソリューションではなく個々のプロジェクトでMSBuildを実行する場合、Visual Studioのバージョンを指定する追加パラメーターを追加する必要があることです。

/p:VisualStudioVersion=12.0

12.0はVS2013用です。使用するバージョンに置き換えてください。このパラメーターを追加すると、機能しました。

完全なコマンドラインは次のようになります。

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

ここで見つけました:

http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

彼らは述べています:

ソリューションではなく個々のプロジェクトを指定する場合、Visual Studioのバージョンを指定するパラメーターを追加する必要があります。

18
felix-b

あなたの公開プロファイルは使用されておらず、デフォルトのパッケージングを行っているようです。 Microsoft Web Publishターゲットは上記のすべてを実行し、構成に基づいて正しいターゲットを選択します。

私はTeamCity MSBuildステップから問題なく動作するようになりましたが、プロファイルへの明示的なパスを指定しました..pubxmlなしで名前で呼び出す必要があります(たとえば、FileSystemDebug)。これは、あなたのものである標準フォルダにある限り発見されます。

例:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

これは、通常「C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v11.0\Web」にあるMicrosoft Web PublishターゲットのVisual Studio 2012バージョンを使用して行われたことに注意してください。使用されている特定の展開タイプターゲットの展開フォルダーを確認します

12
GregS

参考:ビルドサーバーで実行する場合と同じ問題(.NET Core 2.1 WebプロジェクトでVS 2017から駆動されるmsbuild 15がインストールされたJenkins)。

私の場合、プロファイルを無視したのはmsbuildでの「発行」ターゲットの使用でした。

だから私のmsbuildコマンドはで始まりました:

msbuild /t:restore;build;publish

これにより公開プロセスが正しくトリガーされましたが、使用したいプロファイル( "FolderProfile")を選択するために「/ p:PublishProfile = FolderProfile」の組み合わせやバリエーションが機能していませんでした。

発行ターゲットの使用を停止したとき:

msbuild /t:restore;build /p:DeployOnBuild=true /p:PublishProfile=FolderProfile

私は(愚かな)違いはないと思っていましたが、DeployOnBuildスイッチを使用するとすぐに、プロファイルが正しく選択されました。

3
From Orbonia

実際に、上記の問題を解決する方法をすべて自分のソリューションに統合しました。

  1. ニーズに応じてpubxmlファイルを作成します
  2. 次に、pubxmlファイルのすべてのパラメーターをmsbuild.exeのパラメーター「/ p:foo = bar」の独自のリストにコピーします
  3. Pubxmlファイルを破棄します

結果は次のようになります。

msbuild /t:restore /t:build /p:WebPublishMethod=FileSystem /p:publishUrl=C:\builds\MyProject\ /p:DeleteExistingFiles=True /p:LastUsedPlatform="Any CPU" /p:Configuration=Release

1
Rainer

最初に、ソリューション(プロジェクト)を公開できる開発者PCのVisual Studioバージョンを確認します。 VS 2013の場合

 /p:VisualStudioVersion=12.0

上記のコマンドラインを追加して、プロジェクトをビルドするVisual Studioバージョンの種類を指定します。以前の回答として、これはソリューション全体ではなく1つのプロジェクトのみを公開しようとしたときに発生する可能性があります。

1
shammakalubo