Найдите .ipa с поддельным скриптом после сборки TeamCity (Xamarin.iOS Ad-Hoc)

Я пытаюсь настроить сборку CI для своего приложения Xamarin.iOS, используя TeamCity и FAKE, и загрузить результат (файл .ipa) в HockeyApp. Я столкнулся с небольшой проблемой.

Мне удалось запустить сценарий сборки FAKE из TeamCity, а также успешно собрать мое приложение. Следующим шагом будет вызов метода «HockeyApp» из модуля «HockeyAppHelper» из FakeLib, но для этого мне нужен путь к файлу .ipa. Все примеры, которые я нахожу, просто жестко задают путь (что-то вроде bin/iPhone/Release/*.ipa), однако в моем случае .ipa будет помещен в папку, содержащую временную метку (например, bin/iPhone/Release/MyApp 2017-01-24 17-16-56/MyApp.ipa).

Вопрос в том, как мне получить файл .ipa в сценарии сборки (из-за метки времени я не могу жестко указать путь)?

Ниже приведен раздел скрипта FAKE, отвечающий за сборку и загрузку .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
)

person Maurits van Beusekom    schedule 24.01.2017    source источник


Ответы (1)


Видя, что это скорее проблема того, что фактическая задача MSBuild делает в Xamarin.iOS.Common.targets, есть много вещей, которые вы можете сделать.

  1. Вы можете отредактировать файл Xamarin.iOS.Common.targets, чтобы удалить отметку даты и времени. (Не очень хорошо)
  2. Вы можете использовать пользовательскую Target, которая вызывает задачу <Copy>. (Лучше)
  3. Вы можете настроить свойство IpaPackageDir, чтобы указать, каким должен быть каталог. (Лучший)

Короче говоря, проблема TimeStamp возникает непосредственно из этого элемента:

<IpaPackageDir Condition="'$(IpaPackageDir)' == ''">$(DeviceSpecificOutputPath)$(_AppBundleName) $([System.DateTime]::Now.ToString('yyyy-MM-dd HH-mm-ss'))</IpaPackageDir>

Как бы мы сделали каждый из них?

  1. Вы должны отредактировать приведенный выше фрагмент кода в файле Xamarin.iOS.Common.targets и удалить временную метку. Обычно рекомендуется отметить редактирование .targets, если вы не знакомы с ними. Также обновление Xamarin может переопределить их.
  2. Вы можете добавить определение <Target Name="AfterBuild"> с простой задачей копирования внутри: <Copy SourceFiles="$(IpaPackagePath)" DestinationFolder="$(OutputPath)" />
  3. Вы можете изменить свойство <IpaPackageDir> напрямую через: <PropertyGroup> <IpaPackageDir>$(OutputPath)</IpaPackageDir> </PropertyGroup>

Примечание к пункту 3:

Добавлено новое свойство MSBuild IpaPackageDir, упрощающее настройку выходного местоположения файла .ipa. Если для IpaPackageDir задано произвольное расположение, файл .ipa будет помещен в это расположение, а не в подкаталог с отметкой времени по умолчанию.

https://developer.xamarin.com/releases/ios/xamarin.ios_9/xamarin.ios_9.8/#New_MSBuild_property_IpaPackageDir_to_customize_.ipa_output_location

person Jon Douglas    schedule 25.01.2017
comment
Спасибо, Джон, это были знания, которых мне не хватало. Большая помощь. - person Maurits van Beusekom; 25.01.2017