Передача нескольких значений к свойству Wix DefineConstants с MSBuild

Почему это происходит

Списки - это изменяемые объекты, поэтому даже если вы создаете новый объект списка, выполнив matrix[:], ваши подсписки все еще указывают на то же самое объекты ...

Первое решение

Вот первый обходной путь:

matrix = [[1, 2], [3, 4]]
new_copies = []
counter = 0

for i in range(0, 2):
    sublist = matrix[i][:]

    for k in range(0, 2):
        if matrix[i][k] > 3:
            sublist[k] += 10
            counter += 1

    new_copies.append(sublist)

print(matrix)
print(new_copies)

Или с пониманием списков

Если возможно, вы также можете использовать понимание списков [ 115], в этом случае это будет:

new_copies = [[(e + 10 if e > 3 else e) for e in l] for l in matrix]

, который даст вам тот же результат, что и мое предыдущее предложение

Или с изменяемыми объектами

Хорошее решение будет использовать кортежи вместо списков, потому что они являются неизменяемыми объектами. Но это не будет возможно, если вам придется изменять свою матрицу в соответствии с вашей программой.

Или с глубокой копией

Вы также можете использовать метод глубокой копии из библиотеки копий ...

И вы видели, как я иду ...

Я должен напомнить, что по возможности следует избегать использования eval ...

14
задан Rory MacLeod 20 October 2011 в 09:22
поделиться

5 ответов

Проблема:

Задача MSBuild (не MSBuild.exe, задача MSBuild с именем MSBuild) не может обрабатывать несколько констант, используемых проектами WIX. Обычно вы указываете свойства в своем сценарии сборки, например:

<MSBuild Projects="YourSolution.sln" Properties="Configuration=MyConfig;Platform=x86;DefineConstants=&quot;SOMETHING=1;SOMETHINGELSE=2&quot;" />

Однако при просмотре журналов сборки вы видите, что MSBuild разделяет константы и не сохраняет значения, сгруппированные вместе, как вы ожидаете - аналогично:

Task "MSBuild" Global Properties:
Configuration=MyConfig
Platform=x86
DefineConstants="SOMETHING=1
SOMETHINGELSE=2"

Поэтому, когда свеча пытается использовать эти константы, она обычно отвечает сообщением «ошибка CNDL0150: Неопределенная переменная препроцессора '$ (var.SOMETHINGELSE)'. Это означает, что задача MSBuild неправильно обрабатывает свойства, которые содержат несколько знаков '=' в значении. даже если они сгруппированы в кавычках. Без сгруппированных значений свойств в кавычках их, очевидно, следует рассматривать как отдельные свойства, а не как одно значение.

Временное решение:

Чтобы решить эту проблему, вам необходимо чтобы вызвать MSBuild.exe напрямую и передать эти значения ему вручную.

msbuild.exe /p:Configuration=MyConfig /p:Platform=x86 /p:DefineConstants="SOMETHING=1;SOMETHINGELSE=2" YourSolution.sln

Это позволит вашим константам работать так, как вы хотите, без необходимости переделывать проект установки WiX.

ПРИМЕЧАНИЕ: Если вы только используя единственную константу nt вы все еще можете использовать задачу MSBuild следующим образом:

<MSBuild Projects="YourSolution.sln" Properties="Configuration=MyConfig;Platform=x86;DefineConstants=&quot;SOMETHING=1&quot;" />
13
ответ дан 1 December 2019 в 08:20
поделиться

Я думаю, что что-то вроде этого должно работать.

 <DefineConstants>DEBUG;TRACE</DefineConstants> 

Проверка это сообщение в блоге, чтобы видеть, может ли это выручить Вас. http://www.sedodream.com/PermaLink,guid,9b1d23aa-6cb2-48cb-a47a-9cef29622676.aspx

Также проверка это сообщение форума. Это решает подобную проблему как Ваш. http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3f485bf4-1b00-48bf-b5d0-4b83341ce4a6/

0
ответ дан 1 December 2019 в 08:20
поделиться

Почему вы указываете DefineContstants = ProductVersion = XXXXXX?

Для DefineConstants значения не присваиваются, либо константа (например, DEBUG или TRACE) определена, либо нет. Это свойство относится к переключателю компилятора C # / define . Что вы на самом деле пытаетесь сделать?

Также я не уверен, что вы имеете в виду, когда говорите, что мой пост в блоге - это "взлом", весь смысл в том, что он был построен дважды.

Сайед Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build

-1
ответ дан 1 December 2019 в 08:20
поделиться

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

Defines conditional compiler константы. Пары символ/значение разделяются точкой с запятой и задаются с помощью следующего синтаксиса:

symbol1 = value1 ; symbol2 = value2

Свойство эквивалентно ключу компилятора /define переключатель компилятора.

http://msdn.microsoft.com/en-us/library/bb629394.aspx

Согласно MSDN, вы можете 1. определить несколько констант и 2. (@Sayed) присваивать значения

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

1
ответ дан 1 December 2019 в 08:20
поделиться

Обходной путь.

Допущения:

  • Возможные значения SomeEnumValue: EnumValue1 и EnumValue2

В MSBuild:

<DefineConstants>Debug;use_$(SomeEnumValue)</DefineConstants>

В WiX:

<?ifdef $(var.use_EnumValue1) ?>
  ...
<?elseif $(var.use_EnumValue2) ?>
  ...
<?endif?>
0
ответ дан 1 December 2019 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: