生成和发布之间的MSBuild自定义(模糊)步骤

生成和发布之间的MSBuild自定义(模糊)步骤,msbuild,continuous-integration,obfuscation,publish,smartassembly,Msbuild,Continuous Integration,Obfuscation,Publish,Smartassembly,我有一个构建在CI服务器上的web应用程序(WebAPI web服务)。它使用VS2013、发布到文件系统的发布配置文件(*.pubxml)和CI服务器任务中的以下命令构建和发布fine MSBuild %ProjectPath%/MyApp.sln /t:Clean,Build /p:Configuration=Release;DeployOnBuild=True;PublishProfile=TAGBIN;VisualStudioVersion=12.0 但是,我还需要对软件进行模糊处理,

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

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”节点调用obfuscate,但这会导致在生成之前运行模糊处理

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

混淆
$(BuildDependsOn);

似乎不可能将构建与发布分离,目前我唯一的选择是构建两次,其中第二次发布将从第一次构建中提取模糊的文件。

在MSBuild 4.0及更高版本中,您可以使用
BeforeTargets
postertargets

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

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


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