Windows 上的 PlistBuddy

Posted

技术标签:

【中文标题】Windows 上的 PlistBuddy【英文标题】:PlistBuddy on Windows 【发布时间】:2016-11-15 09:26:48 【问题描述】:

我正在将我们的 Xamarin 构建基础架构迁移到基于 Windows 的过程中,我遇到了一个问题,即我们的构建脚本当前使用 PlistBuddy 来读取和写入应用程序的 Info.plist 文件。

显然 PlistBuddy 无法在 Windows 上运行。

有没有人见过任何其他在 Windows 上与 Plist 文件交互的解决方案?我见过一些使用 GUI,但我们需要它来拥有 CLI。

【问题讨论】:

为什么在 Windows 上需要 PlistBuddy?你的 CI 需要一个安装了 ios-SDK 的 macOS 来创建和签署 ipa。 可以,但这都是通过 Visual Studio 和 MSBuild 处理的,这并不意味着构建脚本可以在 OS X 机器上运行。 【参考方案1】:

您可以强制构建代理在 Mac 上运行任意命令,方法是绑定到跨 SSH 连接运行的任何通用 Task/Target(您可以在 Xamarin.iOS .targets 文件中查看更好的想法)。目前可以通过另一种方法使用<Exec> 任务和SessionId$(BuildSessionId)。以下是您可以如何执行此操作的示例:

<Exec Command="..." SessionId="$(BuildSessionId)" />

如果SessionId 为空/空,则表示我们未连接到 Mac。如果它不是 null/empty,那么我们连接到 Mac。

然后我们可以通过以下方式强制此条件始终在 Mac 上运行:

<Exec Command="..." SessionId="$(BuildSessionId)" Condition=" '$(BuildSessionId)' != '' " />

请注意,以下内置任务已公开用于远程执行:

复制 删除 执行 制作目录 移动 删除目录 触摸

来源:https://github.com/xamarin/xamarin-macios/blob/fc55e4306f79491fd269ca2495c6a859799cb1c6/msbuild/Xamarin.iOS.Tasks.Core/Xamarin.iOS.Common.targets#L74-L80

然后您可以通过此方法调用PlistBuddy 命令。

前:

  <Target Name="_SayGoodbye">
    <Exec Command="plistbuddy ..." SessionId="$(BuildSessionId)" Condition=" '$(BuildSessionId)' != '' "/>
  </Target>

如果您想使用MSBuild 自定义任务方式,您可以在此处查看以前构建的任务的示例:

https://github.com/xamarin/xamarin-macios/tree/fc55e4306f79491fd269ca2495c6a859799cb1c6/msbuild/Xamarin.iOS.Tasks.Core/Tasks

EX使用中的Plist:

https://github.com/xamarin/xamarin-macios/blob/fc55e4306f79491fd269ca2495c6a859799cb1c6/msbuild/Xamarin.iOS.Tasks.Core/Tasks/MTouchTaskBase.cs#L608

EX 使用 Plist 进行测试:

https://github.com/xamarin/xamarin-macios/tree/fc55e4306f79491fd269ca2495c6a859799cb1c6/msbuild/tests/Xamarin.iOS.Tasks.Tests/TaskTests/GeneratePlistTaskTests

此时这更像是一个 MSBuild 自定义,但使用这些项目绝对可以完成您想要做的事情。

【讨论】:

以上是关于Windows 上的 PlistBuddy的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS“任务栏”上的内容为

在Windows 上的 Python

如何从 Windows 10 上的容器连接到 docker 主机(Docker for Windows)

Windows 上的 WaitOnAddress() 在 Linux 上的完全等价物是啥?

为啥 Windows 上的 IE/Chrome 不支持端口 27977 上的 SOCKS5 代理? [关闭]

有啥方法可以从 Windows 7 上的 Windows 服务启动 GUI 应用程序?