#android #ios #xamarin #xamarin.forms #azure-devops
Вопрос:
У меня есть проект Xamarin Forms для iOS и Android. Решение имеет четыре конфигурации: Тест — Отладка, Тест — Выпуск, Производство — Отладка, Производство — Выпуск.
Проект shared (PCL) имеет условный символ компиляции для двух конфигураций тестов, TEST. То же самое для производственных конфигураций и продуктов
Когда я выполняю из Visual Studio через отладчик, условная компиляция, которая выполняется в функции запуска PCL (App.cs), работает должным образом во всех четырех конфигурациях:
#if TEST CurrentAppFlavor = Flavor.Test; #else CurrentAppFlavor = Flavor.Production; #endif
Однако; Когда я создаю этот же проект с помощью конвейеров Azure Devops, несмотря на выбор правильной конфигурации сборки в msbuild (и журналы подтверждают это), упакованные сборки выполняются так, как будто символ условной компиляции не существует (и, следовательно, по умолчанию используется для производства).
inputs: projectFile: '**/*droid*.csproj' outputDirectory: '$(outputDirectory)' configuration: '$(buildConfiguration)' msbuildVersionOption: '16.0' msbuildArguments: | /t:SignAndroidPackage /p:AndroidKeyStore="True" ... (additional signing vars)
Я подтвердил, что выбрана правильная конфигурация сборки (в основном потому, что недопустимые конфигурации отображаются как ошибка), но результирующие двоичные файлы ведут себя не так, как ожидалось. Единственное, что я могу придумать, что отличается от построения с помощью командной строки, — это то, что мы создаем конкретный проект, а не решение. Но, возможно, я неправильно использую символы условной компиляции? нужно ли указывать символы компиляции в командной строке, даже если они определены в csproj специально? Любая помощь будет признательна!
Ответ №1:
Оказывается, в проекте PCL мои параметры определения были ограничены сборками AnyCPU; и во время сборки задача XamariniOS в Azure Devops строится для /p:Платформа=iPhone. Почему константа работала при локальной отладке, я не уверен, потому что локальная отладка сборки должна была быть iPhoneSimulator, а не AnyCPU.