私が最終的に思いついた答えは、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 は慎重に進めてください。