使用 Cake 构建脚本选择正确的 SignTool

Pickig the right SignTool with Cake build script

我对 Cakes Sign 方法有疑问。 在我自己的 PC 上,它工作得很好,但在构建服务器上,它显然发现了 SignTool.exe 的旧版本,它不支持 /as 开关(SignToolSettings 中的 AppendSignature = true)。 搜索构建服务器,仅 "Program Files (x86)" 就有 15 个实例。 日期范围从 2010 年到 2019 年。 我可以做些什么来帮助 Cake 选择正确的 SignTool?

我正在使用 Cake 0.34.1

编辑:

devlead 的解决方案绝对是可行的,但必须指示每个开发人员为工具的位置设置环境变量,可能并不总是可取的。

更复杂的是,我的构建脚本使用了 WinSDK 中的三个工具,它们甚至不一定位于一台机器上的同一目录中。

我想出了一个解决方案,该解决方案建立在对优先列表中工具的可能位置的经验知识的基础上:

FilePath LocateTool(FilePath tool, IEnumerable<DirectoryPath> possiblePaths)
{
   return possiblePaths.FirstOrDefault(p => FileExists(p.CombineWithFilePath(tool).FullPath))?.CombineWithFilePath(tool) ?? throw new CakeException($"Tool {tool} not found");
}
///////////////////////////////////////////////////////////////////////////////
// SETUP / TEARDOWN
///////////////////////////////////////////////////////////////////////////////

Setup(ctx =>
{
   var WinKitPaths = new List<DirectoryPath>()
      .Append("C:/Program Files (x86)/Windows Kits/10/bin/x86")
      .Append("C:/Program Files (x86)/Windows Kits/8.1/bin/x86")
      .Append("C:/Program Files (x86)/Windows Kits/8.0/bin/x86");
   ctx.Tools.RegisterFile(LocateTool("stampinf.exe", WinKitPaths));
   ctx.Tools.RegisterFile(LocateTool("inf2cat.exe", WinKitPaths));
   ctx.Tools.RegisterFile(LocateTool("signtool.exe", WinKitPaths));
});

此解决方案不需要弄乱环境变量,但可能需要在此过程中添加其他路径。

默认情况下,Cake 将使用 Windows 在注册表中找到的 SDK 路径来解析 SignTool.exe,如果在注册表中找不到 SDK 路径,它将尝试已知路径是程序文件。

它以Windows 10 SDK开始,然后是Windows 8,最后是Windows 7,所以通常至少应该尝试选择最新的,你可以在[=中看到逻辑13=].

因此,在您的构建服务器上安装 Windows 10 SDK 可能会解决问题。

虽然所有 Cake 工具路径都可以被覆盖,所以如果您已经安装了最新版本并且 Cake 无法自动解析它,那么您可以在 SignToolSignSettings.

上指定它

一种方法是在构建服务器上使用环境变量

var signToolSettings = new SignToolSignSettings {
    ToolPath = EnvironmentVariable("SignToolPath")
};

如果未指定变量,它将使用默认工具分辨率,如果在启动前设置了环境变量,即

SignToolPath 环境变量设置为 'C:\Program Files (x86)\Windows Kits\bin\x64\signtool.exe',那么不管怎样都会使用该路径。