96

私は ac# .Net 4.0 プロジェクトを VS2010 で作成し、現在 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 からこの単純な結果を取得するにはどうすればよいですか?

4

8 に答える 8

45

ここで答えを見つけました: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio 2010 には、優れた新しい Web アプリケーション プロジェクト発行機能があり、ボタンをクリックするだけで Web アプリ プロジェクトを簡単に発行できます。舞台裏では、Web.config の変換とパッケージのビルドは、プロジェクト ファイルにインポートされた大規模な MSBuild スクリプトによって行われます (C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft にあります)。 .Web.Publishing.targets)。残念ながら、スクリプトは非常に複雑で、乱雑で、文書化されていません (ファイル内のいくつかのスペルが間違っていて、ほとんど役に立たないコメントを除いて)。そのファイルの大きなフローチャートとそれに接続する方法に関するいくつかのドキュメントがあればいいのですが、残念ながら不足しているようです (または、少なくとも私はそれを見つけることができません)。

残念ながら、これは、コマンド ライン経由での公開の実行が、必要以上に不透明であることを意味します。最近は多くのショップが継続的インテグレーション サーバーを使用しており、一部のショップでは自動展開を行っているため (VS2010 の公開機能が大いに役立つ可能性があります)、この分野のドキュメントが不足していることに驚きました。簡単に!) は、この機能のかなりの主要な要件でした。

とにかく、Microsoft.Web.Publishing.targets ファイルを何時間も掘り下げ、試行錯誤の壁に頭をぶつけた後、「ファイル システムに発行」をクリックするだけで、Visual Studio がその魔法をどのように実行するかを理解することができました。および「展開パッケージのビルド」機能。MSBuild のスクリプトについて少し説明するので、MSBuild に慣れていない場合は、このクラッシュ コースの MSDN ページを確認することをお勧めします。

ファイル システムにパブリッシュ

VS2010 Publish To File System ダイアログの Publish to File System は、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 フォルダーをルートとする新しいパスに変換します (これらの %() の意味については、Well-Known Item Metadata を参照してください)。

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

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
于 2013-04-26T23:43:14.947 に答える
19

上記のすべての回答を試してもまだ問題がありました (私は 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 のバージョンを指定するパラメーターを追加する必要があります。

于 2016-05-10T09:32:49.223 に答える
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:構成=リリース

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

于 2021-01-10T13:40:14.330 に答える