gpt4 book ai didi

.net - 如何将 CC.NET 自动构建版本戳写入全局程序集信息文件并由多个 .NET 应用程序引用?

转载 作者:行者123 更新时间:2023-12-01 11:06:22 24 4
gpt4 key购买 nike

我目前正在“自动化构建”我们的 .NET 解决方案(其中包含许多项目,至少 20 个。一些 winForms,一些 Web 项目,都具有不同的发布配置......呃!)。我正在使用 CruiseControl.NET(或 CC.NET,whatevs)和 nANT。另外,DOS 和 Powershell 以及其他一些我们不需要深入研究的魔 bean :)

我的目标是制作一个构建标签(顺便说一句,我已经有了半成品)。构建标签由 Min/Maj 编号加上 SVN checkin 编号组成。这对我们来说很好,我们对此很满意。我现在需要让我的 .NET 项目引用内部版本号,以便我的 QA 团队成员知道他们正在测试的内部版本号。

我的版本标签 nANT 任务如下所示:

<project name="updateassemblyversion" default="updateassemblyversion">
<target name="updateassemblyversion" description="generates the version number">
<echo message="Setting the build version to ${CCNetLabel}..." />
<attrib file="AssemblyInfo.cs" readonly="false" />
<asminfo output="AssemblyInfo.cs" language="CSharp">
<imports>
<import namespace="System" />
<import namespace="System.Reflection" />
</imports>
<attributes>
<attribute type="AssemblyVersionAttribute" value="${CCNetLabel}" />
<attribute type="AssemblyFileVersionAttribute" value="${CCNetLabel}" />
</attributes>
</asminfo>
<attrib file="AssemblyInfo.cs" readonly="true" />
</target>

无论如何,我正在尝试在我的构建服务器上设置程序集信息。我已经读到,要写入 20 多个 AssemblyInfo.cs 文件并不是最佳做法,因此我手动创建了一个 GlobalyAssemblyInfo.cs 文件,作为“解决方案项目”,它通过“Add.. .现有项目...添加链接”。我不认为这是我需要的,因为我的版本控制将发生在构建服务器上......

公平地指出,我一直在测试的我当前工作的 nANT 任务(上面的示例)使用了我需要的正确版本戳,但该任务不适合我的场景。它会创建一个新的 AssemblyInfo.cs 文件,并在构建已编译后对其进行版本标记。我知道那是错误的,但它本质上是在生产我需要的东西,但我不确定如何在我的“构建”脚本中以我需要的顺序使用它。我知道它应该在编译发生之前发生,但是如何让编译任务使用新生成的文件呢? (参见问题 #4)。

这里是我不明白的地方:

  1. 我是否保留我的 20 多个 AssemblyInfo.cs 文件?他们的是什么现在的目的?我不需要它们,我需要不信。我可能不应该从解决方案文件中删除它们,但它们没用,对吧?
  2. 如果我使用生成的 GlobalAssemblyInfo.cs 文件,从我的nANT 任务,如何获得引用它,并对其进行版本标记用于我的编译内容?
  3. 正在手动创建 GlobalAssemblyInfo 文件(在我的解决方案),并引用它来自每个项目,对我无效情况?我觉得我不需要我的解决方案中的这些文件引用和项目,我只需要它在我的构建例程中服务器。我已经生产了“AssemblyXYZ.cs”文件(来自 nANT)带有正确的版本标记。我不应该只用它来编译吗我所有的项目与?
  4. 如果#3 为真,我如何在我的 CC.NET 配置中实现它文件(或 nANT 天哪?)。基本上,我如何告诉 VS 编译器使用我的新 GlobalAssemblyInfo.cs(由 nANT 生成)适用于所有 20 多个 .NET我的解决方案中的项目?
  5. 如何让我的 .NET 项目引用(内部)新的生成,动态构建编号/版本戳?我需要质量检查能够在应用程序中看到它用户界面。

一旦发生这种情况,我将成为一名快乐的汽车制造商 :)干杯!

最佳答案

我在 CC.NET 上遇到了同样的问题...我最终放弃了 NANT 并编写了一个自定义的 CC.NET 插件,以编程方式为每个项目更新 AssemblyInfo.cs。实现 CC.NET 插件非常简单。

using System.Collections.Generic; 
using System.IO;
using Exortech.NetReflector;
using ThoughtWorks.CruiseControl.Core;

namespace ccnet.AssemblyVersionUpdater.plugin {
[ReflectorType("assemblyRevisioner")]
public class AssemblyRevisioner : ITask {
public AssemblyRevisioner() {
}

[ReflectorProperty("rootFolder", Required = true)]
public string RootFolder { get; set; }

public void Run(IIntegrationResult result) {
foreach (var file in GetAssemblyInfoFiles(RootFolder)) {
var tmp = file + ".tmp";
using (var sr = new StreamReader(file)) {
using (var st = new StreamWriter(tmp)) {
string line;
var versionSet = false;
var fileVersionSet = false;
while ((line = sr.ReadLine()) != null) {
if (!versionSet && line.StartsWith("[assembly: AssemblyVersion(")) {
st.WriteLine("[assembly: AssemblyVersion(\"{0}\")]", result.Label);
versionSet = true;
} else {
if (!fileVersionSet && line.StartsWith("[assembly: AssemblyFileVersion(")) {
st.WriteLine("[assembly: AssemblyFileVersion(\"{0}\")]", result.Label);
fileVersionSet = true;
} else {
st.WriteLine(line);
}
}
st.Flush();
}
st.Close();
}
sr.Close();
}
File.SetAttributes(file, FileAttributes.Normal);
File.Copy(tmp, file, true);
File.Delete(tmp);
}

}

private static IEnumerable<string> GetAssemblyInfoFiles(string b) {
var result = new List<string>();
var stack = new Stack<string>();
stack.Push(b);
while (stack.Count > 0) {
var dir = stack.Pop();
try {
result.AddRange(Directory.GetFiles(dir, "AssemblyInfo.cs"));
foreach (var dn in Directory.GetDirectories(dir)) {
stack.Push(dn);
}
} catch {
}
}
return result;
}

}
}

编译 DLL 并将其放在 CruiseControl.NET\server 文件夹中。需要重新启动 CC.NET 才能安装插件。然后在适当的 CC.NET 配置文件中:

<tasks>
<assemblyRevisioner>
<rootFolder>E:\Build\Source\Project1</rootFolder>
</assemblyRevisioner>
...
</tasks>

此代码“就地”编辑 AssemblyInfo.cs,并在构建项目之前将版本号替换为来自 CC.NET 的版本号。我确信有更优雅的方法来增加版本号,但这对我来说一直很好。

关于.net - 如何将 CC.NET 自动构建版本戳写入全局程序集信息文件并由多个 .NET 应用程序引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397297/

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