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


88

VS2010で作成されたac#.Net 4.0プロジェクトがあり、現在VS2012でアクセスされています。

この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からこの単純な結果を取得するにはどうすればよいですか?

回答:


52

参考: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に変更しましたが、これが必要かどうかはわかりませんが、条件部分を必ず削除する必要がありました。)


1
Condition="false"下位互換性のために、withの条件付きインポートが存在します。VS2010では、偽の状態のためにスキップされた場合でも、このインポートが存在する必要があります。もう一度見ると、csprojには$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets、現在のバージョンのVisualStudioのターゲットファイルに解決される別のインポートが含まれていることがわかります。
Steven Liekens 2016年

3
$(MSBuildToolsVersion)適切なVSバージョンを説明するためのパスでの戦略的な使用に注意してください<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="false" />。これは、VS2015 Update 1で私のために機能しました。–
Al Dass

43

ここで答えが見つかりました: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

3
新しいターゲットのコードスニペットを理解できません(01 02 03 ...と表示されます)。編集していただけませんか?
fan711 2013年

2
fan711に同意します。しかし、解決策はリンクで説明されています-それではそれをコピーするのは何のためでしたか?
АнтонКурьян

4
@АнтонКурьян:リンクはしばらくすると死ぬ傾向があるため、stackoverflow.comの質問と回答は、外部リソースに依存せずに常に自己完結型にする必要があります。
オリバー

結果は、発行プロファイルがMSBuildによってまったく使用されていないように見え、代わりにパッケージを実行しています(おそらくデフォルトですか?)。以下のソリューションは、プロファイルが実行するように設定されていることを複製するために実行します。これは、Microsoft.Web.Publishing.targetsが、(ファイルシステムの)展開フォルダーから正しいタイプを選択することによって処理します。つまり、その問題を解決するのではなく、ここで車輪の再発明をしているように見えます。しかし、MSBuildログなしでは確実に言うことはできません。私は仕事に
取り掛かり

1
GregSのソリューションは私には機能しません。正常にビルドされますが、ファイルは公開ディレクトリにコピーされません
rushinge 2015年

19

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

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

/p:VisualStudioVersion=12.0

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

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

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

彼らは述べています:

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


12

公開プロファイルが使用されておらず、デフォルトのパッケージ化が行われているように見えます。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」にあるMicrosoftWebPublishターゲットのVisualStudio2012バージョンを使用して行われたことに注意してください。使用されている特定のデプロイメントタイプのターゲットについては、デプロイフォルダを確認してください


これが数年前に投稿されて以来、MSは多くの改善を行いました。更新されたプログラミングのおかげですか?
P. Roe 2016年

3

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

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

したがって、msbuildコマンドは次のコマンドで始まりました。

msbuild /t:restore;build;publish

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

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

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

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


2

実際、私は上記の問題を解決する方法を自分の解決策にすべての答えをマージしました:

  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


動作しません-
Toolkitの

1

まず、ソリューション(プロジェクト)を公開できる開発者PCのVisualStudioバージョンを確認します。示されているように、VS2013用です

 /p:VisualStudioVersion=12.0

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

したがって、完全なコードは次のようになります

"C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ msbuild.exe" "C:\ Program Files(x86)\ Jenkins \ workspace \ Jenkinssecondsample \ MVCSampleJenkins \ MVCSampleJenkins.csproj" / T:Build; Package / p :Configuration = DEBUG / p:OutputPath = "obj \ DEBUG" / p:DeployIisAppPath = "デフォルトのWebサイト/ jenkinsdemoapp" /p:VisualStudioVersion=12.0


1
申し訳ありませんが、あなたは質問を大いに誤解したシャンマカルボ。
P. Roe 2017年

1
@shammakalubo答えは正しいですが、完全には述べられていません。このパラメーターは、OPによって言及されたコマンドに追加する必要があります。これにより、次のようになります。MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0このパラメーターは、欠落していたものであり、問​​題を修正しました。あなたは答えを完全に言及する必要があります!
Syed Waqas 2017

@WaqasShahありがとう、あなたが言ったように、私は私の答えを編集し、それがどのように見えるか完全なコードを公開しました。
シャミー

0

プロジェクトフォルダから実行

msbuild / p:DeployOnBuild = true /p:PublishProfile="release-file.pubxml "/ p:AspnetMergePath =" C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.8 Tools "/ p:Configuration = Release

これにより、web.configTransformとAspnetMergePathが処理されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.