在TeamCity构建后使用假脚本查找.ipa(Xamarin.iOS临时)

在TeamCity构建后使用假脚本查找.ipa(Xamarin.iOS临时),xamarin.ios,teamcity,hockeyapp,f#-fake,Xamarin.ios,Teamcity,Hockeyapp,F# Fake,我正在尝试使用TeamCity和FAKE为我的Xamarin.iOS应用程序设置CI构建,并将结果.ipa文件上载到HockeyApp。我遇到了一个小问题 我成功地触发了TeamCity的假构建脚本,并成功构建了我的应用程序。下一步是从FakeLib的HockeyAppHelper模块调用HockeyApp方法,但要做到这一点,我需要.ipa文件的路径。我发现的所有示例都只是硬编码路径,比如bin/iPhone/Release/*.ipa,但在我的例子中,.ipa将被放在一个包含时间戳的文件夹中

我正在尝试使用TeamCity和FAKE为我的Xamarin.iOS应用程序设置CI构建,并将结果.ipa文件上载到HockeyApp。我遇到了一个小问题

我成功地触发了TeamCity的假构建脚本,并成功构建了我的应用程序。下一步是从FakeLib的HockeyAppHelper模块调用HockeyApp方法,但要做到这一点,我需要.ipa文件的路径。我发现的所有示例都只是硬编码路径,比如bin/iPhone/Release/*.ipa,但在我的例子中,.ipa将被放在一个包含时间戳的文件夹中,比如bin/iPhone/Release/MyApp 2017-01-24 17-16-56/MyApp.ipa

问题是,由于无法硬编码路径的时间戳,如何在构建脚本中获得.ipa文件

以下是伪脚本中负责构建和上载.ipa的部分:

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
)

鉴于这更多地是一个关于实际MSBuild任务在Xamarin.iOS.Common.targets中执行什么的问题,您可以做很多事情

您可以编辑Xamarin.iOS.Common.targets文件以删除日期时间戳。不太好 您可以使用调用任务的自定义目标。较好的 您可以自定义IpaPackageDir属性以指定目录应该是什么。最好的 简而言之,时间戳的问题直接来自此元素:

<IpaPackageDir Condition="'$(IpaPackageDir)' == ''">$(DeviceSpecificOutputPath)$(_AppBundleName) $([System.DateTime]::Now.ToString('yyyy-MM-dd HH-mm-ss'))</IpaPackageDir>
我们将如何做每一个呢

您可以在Xamarin.iOS.Common.targets文件中编辑上面的代码段,并删除时间戳。如果您不熟悉edit.Target,通常最好记下它们。更新Xamarin也可以覆盖这些。 您可以添加包含简单复制任务的定义: 您可以通过以下方式直接编辑的属性: $OutputPath 关于3的说明:

已添加新的MSBuild属性IpaPackageDir,以便于自定义.ipa文件输出位置。如果将IpaPackageDir设置为自定义位置,则.ipa文件将放置在该位置,而不是默认的时间戳子目录


鉴于这更多地是一个关于实际MSBuild任务在Xamarin.iOS.Common.targets中执行什么的问题,您可以做很多事情

您可以编辑Xamarin.iOS.Common.targets文件以删除日期时间戳。不太好 您可以使用调用任务的自定义目标。较好的 您可以自定义IpaPackageDir属性以指定目录应该是什么。最好的 简而言之,时间戳的问题直接来自此元素:

<IpaPackageDir Condition="'$(IpaPackageDir)' == ''">$(DeviceSpecificOutputPath)$(_AppBundleName) $([System.DateTime]::Now.ToString('yyyy-MM-dd HH-mm-ss'))</IpaPackageDir>
我们将如何做每一个呢

您可以在Xamarin.iOS.Common.targets文件中编辑上面的代码段,并删除时间戳。如果您不熟悉edit.Target,通常最好记下它们。更新Xamarin也可以覆盖这些。 您可以添加包含简单复制任务的定义: 您可以通过以下方式直接编辑的属性: $OutputPath 关于3的说明:

已添加新的MSBuild属性IpaPackageDir,以便于自定义.ipa文件输出位置。如果将IpaPackageDir设置为自定义位置,则.ipa文件将放置在该位置,而不是默认的时间戳子目录


谢谢你,乔恩,这是我所缺乏的知识。帮了大忙。谢谢你,乔恩,这是我所缺乏的知识。帮了大忙。