为什么MSBuild会忽略我的BeforePublish目标?

时间:2012-10-15 16:10:42

标签: visual-studio-2010 msbuild

我必须在这里遗漏一些明显的东西,但我在ASP.NET MVC Web项目的.csproj文件末尾有这个:

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

据我所知,这应该总是导致发布失败并出现错误。然而,如果我加载项目,右键单击它,然后单击“发布”,这个东西会毫不费力地发布。我错过了什么?

3 个答案:

答案 0 :(得分:14)

我最终提出的答案适用于Visual Studio 2010和Visual Studio 2012;在Web应用程序的.csproj文件结束之前放置它:

<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>

继续阅读以了解我对这个答案背后的想法,但基本上它围绕着Visual Studio 2010定义要挂钩的PipelinePreDeployCopyAllFilesToOneFolder目标的事实,而Visual Studio 2012定义了更多“标准”{{1要挂钩的目标。

上述代码仅允许在Visual Studio中进行MSDeployPublish配置时进行部署发布,但可以轻松修改,以防止所有部署在Visual Studio中发布。

AFAIR,Visual Studio 2010上下文菜单中的“发布”调用webdeploy \ msdeploy工具。我玩了一下,但我根本不喜欢。如果您仍想使用此功能并在某处插入目标 - 您需要知道确切的目标及其依赖属性。

检查 Release

您将找到两个任务 - MSDeploy和VSMSDeploy。后者听起来对我来说很合适。第一个根本没用在这个文件中。但VSMSDeploy用于三个不同的目标, PackageUsingManifest,TestDeployPackageToLocal和MSDeployPublish。后者再次听起来不错;)

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

所以你只需要覆盖一个属性。将它放在目标之前,并在MSDeployPublish之前调用“YourTargetName”。

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

如果您已经切换到MSBuild 4.0,则可以更轻松地挂钩目标。您只需指定<PropertyGroup> <MSDeployPublishDependsOn Condition="'$(MSDeployPublishDependsOn)'!=''"> $(MSDeployPublishDependsOn); YourTargetName; </MSDeployPublishDependsOn> </PropertyGroup> 属性即可。在我们的例子中,它将是这样的:

BeforeTarget

我希望这会有所帮助。询问您是否有更多问题。

PS:我没有检查所有这些,因为我没有任何MSDeploy就绪环境;)

注意:我记得我不鼓励将MSDeploy用于我们自己的产品,因为为continuous integration(CI)系统正确配置MSDeploy非常违反直觉。也许我不是很擅长,你的解决方案也能正常运作。但请小心使用MSDeploy。

答案 1 :(得分:2)

不确定它是否适用于VS 2010,因为我仅在VS 2012中对此进行了测试,但我发现将目标放在(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文件中,它应该在发布之前触发。

答案 2 :(得分:-1)

在我的项目文件中,默认情况下被注释掉了,我不小心在评论中添加了一个新内容,因此没有调用它。愚蠢的错误。

之后我将BeforePublish目标在Visual Studio 2010中运行。

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

注意:你必须提供自己的真棒:)