gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:09:09 25 4
gpt4 key购买 nike

我正在尝试更新 AssemblyInfo.cs 文件以反射(reflect)项目的下一个发布版本,然后再执行任何其他构建步骤。

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

<Import Project="$(ProjectDir)Properties\PublishVersion.proj" />

PublishVersion.proj 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="BeforeBuild">
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output TaskParameter="OutputVersion" PropertyName="SetVersion" />
</FormatVersion>
<FileUpdate Files="$(ProjectDir)Properties\AssemblyInfo.cs"
Regex="\d+\.\d+\.\d+\.\d+"
ReplacementText="$(SetVersion)" />
</Target>
</Project>

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

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

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly ...>
<asmv1:assemblyIdentity name="BHTechSupport.exe" version="1.0.0.4" ... />
...
<entryPoint>
<assemblyIdentity name="BHTechSupport" version="1.0.0.0" ... />
...
</entryPoint>
...
<dependency>
<dependentAssembly ... codebase="BHTechSupport.exe" ...>
<assemblyIdentity name="BHTechSupport" version="1.0.0.0" ... />
...
</dependentAssembly>
</dependency>
...
</asmv1:assembly>

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

对 PublishVersion.proj 的更改有时似乎没有生效,我需要清理解决方案并重新启动 visual studio 才能生效。

最佳答案

也许你必须使用 BeforeBuild目标。

so how do i ensure that my target gets executed before EVERYTHING else?

要检查目标执行情况,您可以将 MSBuild 项目构建输出详细程度 更改为 Diagnostic。在“工具”>“选项”>“项目和解决方案”>“构建并运行”下找到它。然后构建项目并在输出窗口中找到您的目标。

making changes to PublishVersion.proj sometimes seem to not take effect and i need to clean the solution and restart visual studio before effecting.

据我所知,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 元数据或您想要的所有内容。

最后,您必须按如下方式更改您的项目文件:

<UsingTask TaskName="Foo.Build.Tasks.GenerateVersion" AssemblyFile="Foo.Build.Tasks.dll" />

<Target Name="BeforeBuild">
<GenerateVersion>
<Output TaskParameter="GeneratedFiles" ItemName="Compile" />
</GenerateVersion>
</Target>

关于c# - MSBuild:确保目标在任何其他构建步骤之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com