2013-04-26 7 views
66

私はVS2010で作成され、VS2012でアクセスされるc#.Net 4.0プロジェクトを持っています。先場所へmsbuildを使用してファイルシステムを公開する

私はこのウェブサイトからのみ必要なファイルを公開しようとしている

(C:\は\ MyProjectの[ファイル]を構築します)

マイファイル構造: ./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
  • 何もWTF
  • 作成されたzipファイルは、豚の朝食やアプリケーションのために必要されていないファイルがいっぱいです<publishUrl>C:\builds\MyProject\</publishUrl>に配備されていません。

私はこれを実行するフォルダは* Cで作成されたVisual Studioの通過プロフィールを公開:\は\ MyProjectとは *構築し、私が欲しいの正確な成果物が含まれています。

この単純な結果はどのようにmsbuildから取得できますか?ここに答えが見つかり

答えて

30

FYI:Visual Studio 2015で同じ問題が発生しました。数時間の作業の後、今はmsbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofileを実行できます。

私の.csprojファイルを編集する必要がありました。 (私はこれが必要だったかどうかわからない、14.0に10.0を変更し

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

をしかし、私は間違いなく、条件を削除する必要がありました:次のように私はこの行を変更し

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

:。それは、このような行が含まれてい)

+1

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

+3

'$(MSBuildToolsVersion)\ WebApplications \ Microsoft.WebApplication \ \ の適切なVSバージョンを説明するパスに戦略的に使用してください。ターゲット "条件="偽 "/>'。これは私のVS2015アップデート1で働いた。 –

35

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¥)に をインポートした大規模なMSBuildスクリプトによって実行されます。 Web \ Microsoft.Web.Publishing.targets)。 残念なことに、このスクリプトは非常に複雑で厄介で、 は文書化されていません(他にはひどく綴られていて、ほとんど役に立たないものがあります。 )。そのファイルの大きなフローチャートとそれにフックする方法についての のドキュメントはいいかもしれませんが、悲しいことに、少なくとも が不足しているようです(または少なくとも私はそれを見つけることができません)。

残念ながら、これはコマンドライン による公開の実行が、必要以上に不透明であることを意味します。最近、多くのショップで連続した統合サーバー を使用していて、一部の自動インストールでは (VS2010の公開機能が多くを助けることができる)という理由で、 が考えていたので、私はこの領域のドキュメントが であることに驚きましたこれを有効にすると(簡単に!)、機能のためのかなりの主要な要件が になりました。私が把握して管理している時間Microsoft.Web.Publishing.targetsを通じて ファイルを掘ると、試行錯誤壁に を私の頭を叩いた後、とにかく

は、どのようにVisual Studioのその 魔法のいずれかを実行しているようです「ファイルシステムへの公開」および「ビルドの展開 パッケージ」をクリックします。 MSBuildに精通していない場合は、 のMSBuildスクリプティングに取り掛かります。このクラッシュを確認することをお勧めします。 コースMSDNのページ。

はVS2010は、システムダイアログがシステムファイルにパブリッシュファイルに公開するシステム

をファイルに公開し、私はMSBuildの のいくつかの賢明な利用が発生することが予想されるので、私に出てナットにしばらく を取りました。代わりに、VS2010は非常に奇妙なことをしています:MSBuildの を呼び出して、Webののアプリケーションのファイルをプロジェクトのobjフォルダに準備する一種の半分の展開を実行してから、手動でファイルをコピーします。 MSBuildの)あなたのターゲットに フォルダを公開します。 MSBuildは のファイルをコピーするように設計されているので、意味があります。 VS2010がターゲットとしていないターゲットのMSBuildターゲットが1つだけだった場合は、 マニュアルコピー。

これは、コマンドラインでMSBuildを使用すると、 という特定のターゲットを持つプロジェクトファイルを呼び出すのと同じではなく、いくつかのプロパティを設定することが簡単であることを意味します。 をVS2010で実行する必要があります。ハーフデプロイメントを実行するターゲットを自分で作成してから、 を実行すると、結果がターゲットフォルダにコピーされます。プロジェクトファイルを編集するには、 VS2010のプロジェクトを右クリックして[プロジェクトのアンロード]をクリックし、 をもう一度右クリックして[編集]をクリックします。 Webアプリケーションをインポートするインポート要素 (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で指定されたディレクトリに配置されることが示されています。

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

次に、_PackageTempDirフォルダーの下にある すべてのファイルを表すPublishFilesという項目を定義します。コピータスクは と呼ばれ、すべてのファイルがパブリッシュ先フォルダにコピーされます。 Copy要素のDestinationFiles属性は少し複雑です。 アイテムの変換を実行し、そのパスをPublishDestinationフォルダをルートとする新しい パスに変換します(これらの%()の意味を確認するには、Well-Known アイテムメタデータをチェックしてください)。

我々は今、単純に(明らかにあなたに合わせてプロジェクトファイル名とプロパティ の変更)このコマンド を行うことができ、コマンドラインからこのターゲットを呼び出すために:

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

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

+2

私はfan711に同意します。しかし、解決策はリンク上に記載されています - 何のためにそれをコピーするのですか? –

+4

@АнтонКурьян:リンクはしばらくすると消滅する傾向があります。そのため、stackoverflow.comの質問と回答は、外部リソースに依存することなく常に自己完結型でなければなりません。 – Oliver

11

それは次のように私には見えますパブリッシュプロファイルが使用されておらず、既定のパッケージ化が行われています。 Microsoft Web Publishターゲットは上記の作業をすべて行い、設定に基づいて正しいターゲットを選択します。

私はTeamCity MSBuildのステップから問題なく動作しましたが、プロファイルへの明示的なパスを指定しました。名前は.pubxml(例:FileSystemDebug)で呼ぶだけです。それはあなたのものである標準のフォルダの中で見つけられます。

例:\プログラムファイル(x86の)\ MSBuildの\マイクロソフト\のVisualStudioを:これは、マイクロソフトのWebの2012のバージョンは、通常、「Cにある、ターゲットを公開のVisual Studioを使用して行われた

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

注意\ v11.0 \ Web "にあります。使用されている特定の展開タイプのターゲットの展開フォルダを確認してください

+0

MSは数年前に更新されて以来、多くの改善を行いました。 –

13

私はVisual Studio 2013を使用して上記のすべての答えを試しても問題が残っています。パブリッシュフォルダには何もコピーされませんでした。

キャッチは、私が代わりにソリューションの個々のプロジェクトでのMSBuildを実行する場合、私は、Visual Studioのバージョンを指定する追加のパラメータを入れなければならないことだった:VS2013は、バージョンに置き換えるために

/p:VisualStudioVersion=12.0 

12.0ですあなたが使う。一度このパラメータを追加すると、うまくいきました。

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

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 Versioを指定するパラメータを追加する必要がありますn。

+0

これは私のために働いた! –

0

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

/p:VisualStudioVersion=12.0 

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

+0

申し訳ありませんがshammakaluboあなたは多くの質問を誤解しました。 –

+0

@shammakalubo答えは正しいですが、それは完全には述べられていません。 'MSBuild C:¥PathToMyProject¥MyProject.csproj/p:DeployOnBuild = true/p:PublishProfile = MyPublishProfile/p:VisualStudioVersion = 12.0' このパラメータは、OPで記述されたコマンドに追加する必要があります。パラメータは私が行方不明で問題を修正したものです。あなたはちょうど答えを完全に言及する必要があります! –