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;将其放在 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 定义了更“标准”的MSDeployPublish目标来连接。

上面的代码仅允许Release在 Visual Studio 中的配置中进行部署发布,但可以轻松修改它以阻止所有从 Visual Studio 中进行部署发布。

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

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

您会发现两个任务 - MSDeploy 和 VSMSDeploy。后一个听起来很适合我。这个文件中根本没有使用第一个。但是 VSMSDeploy 用于三个不同的目标,PackageUsingManifest、TestDeployPackageToLocal 和 MSDeployPublish。后一个听起来不错;)

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

所以你只需要覆盖一个属性。将它放在您的目标之前,“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-ready 环境;)

注意:我记得我不鼓励将 MSDeploy 用于我们自己的产品,因为为持续集成(CI) 系统正确配置它是非常违反直觉的。也许我不是很擅长,你的解决方案会正常工作。但请谨慎使用 MSDeploy。

于 2012-10-16T13:40:55.880 回答
5

不确定它是否可以在 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 文件中,它应该在发布之前触发。

于 2015-05-26T16:36:56.840 回答
-1

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

之后,我让 BeforePublish 目标在 Visual Studio 2010 中工作。

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

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

于 2013-01-11T09:28:21.023 回答