在 TeamCity 构建后使用 FAKE 脚本定位 .ipa(Xamarin.iOS Ad-Hoc)
Locate .ipa with FAKE script after TeamCity build (Xamarin.iOS Ad-Hoc)
我正在尝试使用 TeamCity 和 FAKE 为我的 Xamarin.iOS 应用程序设置一个 CI 构建,并将结果(.ipa 文件)上传到 HockeyApp。我运行遇到了一个小问题。
我设法从 TeamCity 触发了 FAKE 构建脚本,并成功构建了我的应用程序。下一步是从 FakeLib 的 "HockeyAppHelper" 模块调用 "HockeyApp" 方法,但为此我需要 .ipa 文件的路径。我发现的所有示例都只是对路径进行硬编码(类似于 bin/iPhone/Release/*.ipa
),但是在我的例子中,.ipa 将被放入包含时间戳的文件夹中(例如 bin/iPhone/Release/MyApp 2017-01-24 17-16-56/MyApp.ipa
)。
问题是如何在构建脚本中获取 .ipa 文件(由于时间戳,我无法对路径进行硬编码)?
下面是负责构建和上传 .ipa 的 FAKE 脚本部分:
Target "ios-adhoc" (fun () ->
RestorePackages "RidderCRM.iOS.sln"
UpdatePlist version versionNumber "RidderCRM.iOS"
iOSBuild (fun defaults ->
{defaults with
ProjectPath = "RidderCRM.iOS.sln"
Configuration = "Release"
Platform = "iPhone"
Target = "Build"
BuildIpa = true
Properties = [ "CodesignKey", "iPhone Distribution"; "CodesignProvision", "Automatic:AdHoc" ]
})
let appPath = Directory.EnumerateFiles(Path.Combine("RidderCRM.iOS", "bin", "iPhone", "Release"), "*.ipa").First()
TeamCityHelper.PublishArtifact appPath
HockeyApp (fun p ->
{p with
ApiToken = Environment.GetEnvironmentVariable("HockeyAppApiToken")
File = appPath
}) |> ignore
)
看到这更多是关于 Xamarin.iOS.Common.targets
中实际 MSBuild 任务正在做什么的问题,您可以做很多事情。
- 您可以编辑
Xamarin.iOS.Common.targets
文件以删除日期时间戳。 (不太好)
- 您可以使用调用
<Copy>
任务的自定义 Target
。 (更好)
- 您可以自定义
IpaPackageDir
属性 来指定目录应该是什么。 (最佳)
简而言之,TimeStamp 的问题直接来自这个元素:
<IpaPackageDir Condition="'$(IpaPackageDir)' == ''">$(DeviceSpecificOutputPath)$(_AppBundleName) $([System.DateTime]::Now.ToString('yyyy-MM-dd HH-mm-ss'))</IpaPackageDir>
我们将如何做每一项?
- 您可以在
Xamarin.iOS.Common.targets
文件中编辑上面的代码片段并删除时间戳。如果您不熟悉它们,通常最好注意编辑 .targets
。更新 Xamarin 也可以覆盖这些。
- 您可以添加一个
<Target Name="AfterBuild">
定义,里面有一个简单的复制任务:<Copy SourceFiles="$(IpaPackagePath)" DestinationFolder="$(OutputPath)" />
- 您可以直接通过以下方式编辑
<IpaPackageDir>
的 属性:
<PropertyGroup>
<IpaPackageDir>$(OutputPath)</IpaPackageDir>
</PropertyGroup>
#3 注释:
A new MSBuild property IpaPackageDir has been added to make it easy to customize the .ipa file output location. If IpaPackageDir is set to a custom location, the .ipa file will be placed in that location instead of the default timestamped subdirectory.
我正在尝试使用 TeamCity 和 FAKE 为我的 Xamarin.iOS 应用程序设置一个 CI 构建,并将结果(.ipa 文件)上传到 HockeyApp。我运行遇到了一个小问题。
我设法从 TeamCity 触发了 FAKE 构建脚本,并成功构建了我的应用程序。下一步是从 FakeLib 的 "HockeyAppHelper" 模块调用 "HockeyApp" 方法,但为此我需要 .ipa 文件的路径。我发现的所有示例都只是对路径进行硬编码(类似于 bin/iPhone/Release/*.ipa
),但是在我的例子中,.ipa 将被放入包含时间戳的文件夹中(例如 bin/iPhone/Release/MyApp 2017-01-24 17-16-56/MyApp.ipa
)。
问题是如何在构建脚本中获取 .ipa 文件(由于时间戳,我无法对路径进行硬编码)?
下面是负责构建和上传 .ipa 的 FAKE 脚本部分:
Target "ios-adhoc" (fun () ->
RestorePackages "RidderCRM.iOS.sln"
UpdatePlist version versionNumber "RidderCRM.iOS"
iOSBuild (fun defaults ->
{defaults with
ProjectPath = "RidderCRM.iOS.sln"
Configuration = "Release"
Platform = "iPhone"
Target = "Build"
BuildIpa = true
Properties = [ "CodesignKey", "iPhone Distribution"; "CodesignProvision", "Automatic:AdHoc" ]
})
let appPath = Directory.EnumerateFiles(Path.Combine("RidderCRM.iOS", "bin", "iPhone", "Release"), "*.ipa").First()
TeamCityHelper.PublishArtifact appPath
HockeyApp (fun p ->
{p with
ApiToken = Environment.GetEnvironmentVariable("HockeyAppApiToken")
File = appPath
}) |> ignore
)
看到这更多是关于 Xamarin.iOS.Common.targets
中实际 MSBuild 任务正在做什么的问题,您可以做很多事情。
- 您可以编辑
Xamarin.iOS.Common.targets
文件以删除日期时间戳。 (不太好) - 您可以使用调用
<Copy>
任务的自定义Target
。 (更好) - 您可以自定义
IpaPackageDir
属性 来指定目录应该是什么。 (最佳)
简而言之,TimeStamp 的问题直接来自这个元素:
<IpaPackageDir Condition="'$(IpaPackageDir)' == ''">$(DeviceSpecificOutputPath)$(_AppBundleName) $([System.DateTime]::Now.ToString('yyyy-MM-dd HH-mm-ss'))</IpaPackageDir>
我们将如何做每一项?
- 您可以在
Xamarin.iOS.Common.targets
文件中编辑上面的代码片段并删除时间戳。如果您不熟悉它们,通常最好注意编辑.targets
。更新 Xamarin 也可以覆盖这些。 - 您可以添加一个
<Target Name="AfterBuild">
定义,里面有一个简单的复制任务:<Copy SourceFiles="$(IpaPackagePath)" DestinationFolder="$(OutputPath)" />
- 您可以直接通过以下方式编辑
<IpaPackageDir>
的 属性:<PropertyGroup> <IpaPackageDir>$(OutputPath)</IpaPackageDir> </PropertyGroup>
#3 注释:
A new MSBuild property IpaPackageDir has been added to make it easy to customize the .ipa file output location. If IpaPackageDir is set to a custom location, the .ipa file will be placed in that location instead of the default timestamped subdirectory.