MSBuild:确保在任何其他构建步骤之前运行目标

我正在尝试更新AssemblyInfo.cs文件,以反映在任何其他构建步骤发生之前项目的下一个发布版本。

在我的项目文件中,我在结束前添加:

 

PublishVersion.proj看起来像这样:

            

现在它确实在构建完成之前执行,但绝对不会在它启动之前执行,因为当我查看生成的exe时,它有一个在AssemblyInfo.cs中的文件版本在构建开始之前但.application文件和清单文件有各种引用新版本。

生成清单文件(构建开始前为1.0.0.0,构建后为1.0.0.4):

    ...   ...  ...    ...   ...  

那么如何确保我的目标在其他一切之前被执行?

对PublishVersion.proj进行更改有时似乎没有生效,我需要清理解决方案并在影响之前重新启动visual studio。

也许你必须使用BeforeBuild目标。

那么如何确保我的目标在其他一切之前被执行?

要检查目标执行,可以将MSBuild project build output verbosity更改为Diagnostic 。 在工具>选项>项目和解决方案>构建和运行下找到它。 然后构建项目并在输出窗口中找到目标。

对PublishVersion.proj进行更改有时似乎没有生效,我需要清理解决方案并在影响之前重新启动visual studio。

AFAIK,Visual Studio加载目标文件一次,因此您必须重新加载项目才能查看结果。

更新我不知道您的版本控制系统,但它并不重要。 无论如何,我试图为你提供一个简单的例子。

 using System; using System.IO; using Microsoft.Build.Utilities; using Microsoft.Build.Framework; namespace Foo.Build.Tasks { public sealed class GenerateVersion : Task { [Output] public ITaskItem[] GeneratedFiles { get; private set; } public override bool Execute() { string objPath = Path.Combine(Path.GetDirectoryName(this.BuildEngine3.ProjectFileOfTaskNode), "obj"); string path = Path.Combine(objPath, "VersionInfo.cs"); File.WriteAllText(path, @"using System.Reflection; [assembly: AssemblyVersion(""2.0.0"")]"); GeneratedFiles = new[] { new TaskItem(path) }; return true; } } } 

上述任务生成一个包含AssemblyVersion元数据或所需内容的文件。

最后,您必须更改项目文件,如下所示:

  

      

如果您希望目标在每个构建的开头运行,而不管调用哪个最终目标目标(清除,还原,构建,发布),您可以使用Project元素的InitialTargets属性。