10

ここで明らかな何かが欠けているに違いありませんが、ASP.NET MVC Web プロジェクトの.csprojファイルの最後にこれがあります。

    [...]
    <Target Name="BeforePublish">
        <Error Condition="'foo'=='foo'" Text="test publish error" />
    </Target>
</Project>

私が知る限り、それは常に発行がエラーで失敗する原因となるはずです。それでも、プロジェクトをロードして右クリックし、[発行] をクリックすると、問題なく発行されます。私は何が欠けていますか?

4

3 に答える 3

15

私が最終的に思いついた答えは、Visual Studio 2010 と Visual Studio 2012 でうまく機能します。.csprojこれを Web アプリケーションのファイルの末尾の直前に置きます。

<Project...
    [...]
    <!-- The following makes sure we can't accidentally publish a non-Release configuration from within Visual Studio -->
    <Target Name="PreventNonReleasePublish2010" BeforeTargets="PipelinePreDeployCopyAllFilesToOneFolder" Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'">
        <Error Condition="'$(Configuration)'!='Release'" Text="When publishing from Visual Studio 2010, you must publish the Release configuration!" />
    </Target>
    <Target Name="PreventNonReleasePublish2012" BeforeTargets="MSDeployPublish" Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='11.0'">
        <Error Condition="'$(Configuration)'!='Release'" Text="When publishing from Visual Studio 2012, you must publish the Release configuration!" />
    </Target>
</Project>

PipelinePreDeployCopyAllFilesToOneFolderこの回答の背後にある私の考えを読んでください。ただし、基本的には、Visual Studio 2010がフックするターゲットを定義し、Visual Studio 2012 がフックするより「標準的な」ターゲットを定義するという事実を中心に展開していMSDeployPublishます。

上記のコードは、Visual Studio 内からの構成でのみ展開の公開を許可しますが、Visual Studio 内からのすべての展開の公開Releaseを禁止するように簡単に変更できます。

AFAIR、Visual Studio 2010 のコンテキスト メニューから「発行」すると、webdeploy\msdeploy ツールが呼び出されます。少し遊んでみましたが、全然好きではありませんでした。この機能を引き続き使用し、ターゲットをどこかに挿入したい場合は、正確なターゲットとその依存関係を知る必要があります。

小切手 c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets

MSDeploy と VSMSDeploy の 2 つのタスクがあります。後者は私にはぴったりです。最初のものは、このファイルではまったく使用されていません。ただし、VSMSDeploy は、PackageUsingManifest、TestDeployPackageToLocal、および MSDeployPublish の 3 つの異なるターゲットで使用されます。やはり後者はいいですね ;)

<Target Name="MSDeployPublish" DependsOnTargets="$(MSDeployPublishDependsOn)">

したがって、1 つのプロパティをオーバーライドするだけで済みます。これをターゲットの前に置くと、"YourTargetName" が MSDeployPublish の直前に呼び出されます。

<PropertyGroup>
    <MSDeployPublishDependsOn Condition="'$(MSDeployPublishDependsOn)'!=''">
        $(MSDeployPublishDependsOn);
        YourTargetName;
    </MSDeployPublishDependsOn>
  </PropertyGroup>

既に MSBuild 4.0 に切り替えている場合は、ターゲットをフックする簡単な方法があります。BeforeTarget属性を指定するだけです。私たちの場合、次のようになります。

  <Target Name="MyTarget" BeforeTargets="MSDeployPublish">
        <Error Condition="'foo'=='foo'" Text="test publish error" />
  </Target>

これが役立つことを願っています。さらに質問がある場合は尋ねてください。

PS: 私は MSDeploy 対応の環境を持っていないので、すべてをチェックしませんでした;)

注:継続的インテグレーション(CI) システム用に MSDeploy を適切に構成するのは非常に直感的ではないため、自社製品に MSDeploy を使用することを思いとどまらせたことを覚えています。多分私はそれがあまり得意ではなかったので、あなたのソリューションは適切に機能します。ただし、MSDeploy は慎重に進めてください。

于 2012-10-16T13:40:55.880 に答える
5

VS 2012 でしかテストしていないため、VS 2010 で機能するかどうかはわかりませんが、ターゲットを (ProjectDir)/Properties/PublishProfiles/(ProfileName).pubxml ファイルに「AfterBuild」として配置することがわかりました。対象作品。のように、プロジェクトをビルドするときは起動しませんが、プロジェクトを公開すると起動します。

だから置く代わりに

<Target Name="BeforePublish">
    <Error Condition="'foo'=='foo'" Text="test publish error" />
</Target>

あなたの .csproj ファイルに、入れてみてください

<Target Name="AfterBuild">
    <Error Condition="'foo'=='foo'" Text="test publish error" />
</Target>

代わりに .pubxml ファイルで、公開する直前に起動する必要があります。

于 2015-05-26T16:36:56.840 に答える
-1

私のプロジェクト ファイルでは、 と はデフォルトでコメント アウトされていますが、誤ってコメント内に新しい を追加したため、呼び出されませんでした。愚かな間違い。

その後、BeforePublish ターゲットが Visual Studio 2010 で動作するようになりました。

<Target Name="BeforePublish">
 //insert awesome here
 </Target>

注:あなたはあなた自身の素晴らしいものを提供する必要があります:)

于 2013-01-11T09:28:21.023 に答える