【问题标题】:MSBuild custom (obfuscate) step between build and publish构建和发布之间的 MSBuild 自定义(混淆)步骤
【发布时间】:2015-04-02 15:16:34
【问题描述】:

我有一个构建在我的 CI 服务器上的 Web 应用程序(WebAPI Web 服务)。它使用 VS2013、发布到文件系统发布配置文件 (*.pubxml) 和来自 CI 服务器任务的以下命令构建和发布良好。

MSBuild %ProjectPath%/MyApp.sln /t:Clean,Build /p:Configuration=Release;DeployOnBuild=True;PublishProfile=TAGBIN;VisualStudioVersion=12.0

但是我还需要混淆软件,混淆器(Red Gate Smart Assembly)是通过放置在 csproj 文件中的以下 xml 调用的。

<UsingTask TaskName="SmartAssembly.MSBuild.Tasks.Build" AssemblyName="SmartAssembly.MSBuild.Tasks, Version=6.0.0.0,&#xD;&#xA;Culture=neutral, PublicKeyToken=7f465a1c156d4d57" />
<Target Name="PostBuildEvent" Condition=" '$(Configuration)' == 'Release' ">
    <SmartAssembly.MSBuild.Tasks.Build ProjectFile="MyApp.saproj" />
</Target>

这似乎构建和发布正常,但是在检查命令行输出时我注意到发布发生在混淆之前。

显然需要在构建之后,但在发布之前进行混淆,这可能吗?

我尝试了一些方法,包括编辑 *.pub.xml 文件以通过“BuildDependsOn”节点调用混淆,但这会导致混淆在构建之前运行。

<BuildDependsOn>        
    Obfuscate;
    $(BuildDependsOn);
</BuildDependsOn>

似乎无法将构建与发布分离,我目前唯一的选择是构建两次,第二次发布从第一次构建中提取混淆文件。

【问题讨论】:

  • 您的增量构建严重损坏。原因是您的SmartAssembly 任务会就地覆盖之前构建步骤中生成的文件。增量构建的逻辑是基于文件时间戳的,所以你会看到奇怪的构建行为构建和重新构建你的项目。我建议您从正确定义目标开始,将输入与输出分开,并在目标元素上指定InputsOutputs 属性。
  • Smart Assembly 任务实际上将混淆后的可执行文件放在一个单独的文件夹中,我将发布配置为从这个“混淆”文件夹中获取文件。我遇到的问题是发布发生在混淆之前,因此还没有任何混淆文件要发布。我只想知道如何在混淆后进行发布。
  • 您写道“这似乎构建和发布正常”,这意味着发布步骤从您重新配置的位置找到了带有混淆二进制文件的二进制文件。如果 CSC 创建的原始二进制文件没有被您的自定义步骤覆盖,那么您应该没问题。 MSBuild 中的排序很简单,只需使用属性BeforeTargets 和/或AfterTargets

标签: msbuild continuous-integration obfuscation publish smartassembly


【解决方案1】:

在 MSBuild 4.0 及更高版本中,您可以使用BeforeTargetsAfterTargetscontrol target build order

下面的示例介绍了在构建之后但在发布之前执行的新构建步骤:

<Target Name="MyNewBuildStep" AfterTargets="CoreBuild" BeforeTargets="Publish">
    <Message Text="Executing new build step" />
</Target>

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多