Задачи сборки vsts xamarin.ios определяют несколько констант с помощью / p: defineconstants

Я использую задачу сборки Xamarin.iOS в VSTS для создания своего решения. Я хочу определить константы ENABLE_ANALYTICS и ENV_DEV.

К сожалению, я не могу понять, что нужно ввести в поле ввода Arguments, чтобы заставить его работать успешно. Я использую агент сборки Hosted macOS Preview и инструмент сборки msbuild (Visual Studio for Mac).

Я пытался:

/p:DefineConstants=ENABLE_ANALYTICS;ENV_DEV

MSBUILD : error MSB1006: Property is not valid.

Switch: ENV_DEV

/p:DefineConstants="ENABLE_ANALYTICS;ENV_DEV"

MSBUILD : error MSB1006: Property is not valid.

Switch: ENV_DEV

/p:DefineConstants='ENABLE_ANALYTICS;ENV_DEV'

MSBUILD : error MSB1006: Property is not valid.

Switch: ENV_DEV'

/p:DefineConstants=""ENABLE_ANALYTICS;ENV_DEV""

MSBUILD : error MSB1006: Property is not valid.

Switch: ENV_DEV

'/p:DefineConstants=""ENABLE_ANALYTICS;ENV_DEV"'

MSBUILD : error MSB1008: Only one project can be specified.

Switch: '/p:DefineConstants=ENABLE_ANALYTICS;ENV_DEV'

Разве вам не лучше вместо этого определить новую конфигурацию для вашего решения? Таким образом, вместо Debug и Release у вас также есть Foo.

DavidG 11.04.2018 14:28

Я хотел избежать создания конфигурации для каждой перестановки всех констант :(

Sven-Michael Stübe 11.04.2018 14:33

А вместо этого у вас будет множество определений сборки в VSTS?

DavidG 11.04.2018 14:39

Хм, может ты и прав. Я должен это переосмыслить. Дай мне попробовать.

Sven-Michael Stübe 11.04.2018 14:47

@ Sven-MichaelStübe Можете ли вы поделиться файлом проекта и подробным журналом сборки vsts (установив system.debug как true)? А какую конфигурацию сборки вы использовали? Если вы используете Release для конфигурации сборки, попробуйте снова выполнить сборку с помощью Debug Build Configuration?

Marina Liu 12.04.2018 09:32
2
5
329
3

Ответы 3

Я думаю, вам нужно избежать точки с запятой:

/p:DefineConstants=ENABLE_ANALYTICS\;ENV_DEV

Тоже не работает. MSBUILD : error MSB1005: Specify a property and its value.

Sergey Metlov 19.02.2021 14:54

Я столкнулся с аналогичной проблемой и решил ее, дважды добавив константы

/p:DefineConstants=ENABLE_ANALYTICS /p:DefineConstants=ENV_DEV

У меня это не сработало. Применяется только последняя константа.

Sergey Metlov 19.02.2021 14:50

Основная причина проблемы заключалась в том, что сценарий сборки удалял все двойные кавычки, если они не были экранированы. И алгоритм побега оказался не совсем тривиальным. Это функция, выполняющая это.

for (var i=0; i < argString.length; i++) {
    var c = argString.charAt(i);

        if (c === '"') {
            if (!escaped) {
                inQuotes = !inQuotes;
            }
            else {
                append(c);
            }
            continue;
        }
                
        if (c === "\\" && inQuotes) {
            escaped = true;
            continue;
        }

        if (c === ' ' && !inQuotes) {
            if (arg.length > 0) {
            args.push(arg);
            arg = '';
        }
        continue;
    }
    append(c);
}

поэтому, чтобы сохранить двойные кавычки в результирующей строке, она должна выглядеть так:

/p:DefineConstants="\"A;B\"

При использовании для задачи XamariniOS:

- task: XamariniOS@2
  inputs:
    ...
    args: '/p:DefineConstants="\"A;B\"'

В качестве бонуса, вот пример скрипта конвейера, позволяющего выбирать константы для включения через пользовательский интерфейс «Выполнить конвейер».

run pipeline ui

parameters:
- name: ENABLE_DEBUG_ERROR_MESSAGES
  displayName: 'Enable debug error messages'
  type: boolean
  default: true
- name: ENABLE_MOCK_API_OPTION
  displayName: 'Enable mock API option'
  type: boolean
  default: true

trigger:
- develop

variables:
- ${{ each p in parameters }}:
  - name: "DEFINECONSTANT_${{p.key}}"
    value: ${{ p.value }}

pool:
  vmImage: 'macos-latest'

steps:
- pwsh: |
    $constantVars = Get-ChildItem -Path Env:\ | Where-Object Name -like "DEFINECONSTANT_ENABLE_*"
    $constantList = "/p:DefineConstants=`"\`""
    $constantVars | ForEach-Object {
      if ($_.Value -eq 'True') {
        $constantList += "$($_.Name.Replace('DEFINECONSTANT_', ''));"
      }
    }
    $constantList += "\`""
    Write-Host $constantList
    echo "##vso[task.setvariable variable=define]$constantList"

- bash: echo 'My pipeline variable is $(define)'

- task: XamariniOS@2
  inputs:
    solutionFile: 'YOUR_SOLUTION.sln'
    configuration: 'Release'
    packageApp: false
    buildForSimulator: true
    runNugetRestore: false
    args: '$(define)'

P.S. Спасибо @WaitingForGuacamole за помощь в написании скрипта выше в эта почта.

Другие вопросы по теме