Почему я могу использовать некоторые переменные среды в некоторых элементах файла csproj, но не могу использовать другие в msbuild?

Какие причины могут быть для следующего странного поведения и как я могу отследить проблемы?

Мы используем комбинацию файлов make и msbuild.

У меня есть проект, который должен быть строго назван. Ранее я устанавливал snk для использования в файле проекта следующим образом:

<AssemblyOriginatorKeyFile>$(EnvironmentVariable)TheKeyName.snk</AssemblyOriginatorKeyFile> 

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

set EnvironmentVariable='SomePath'

и это сработало нормально. Теперь мне нужно, чтобы ключ имени строки можно было изменить, чтобы он мог отличаться на машине разработчика и на сервере сборки выпуска. Существует переменная, которая содержит полный путь к файлу ключа строгого имени, который называется StrongNameKeyFile. Это определено в среде msbuild, и если я помещу некоторый текстовый вывод в файлы целей или свойств, которые включены как часть задачи msbuild, которая создает проект, я увижу, что этот StrongNameKeyFile указывает на правильное местоположение. Поэтому я изменил csproj, чтобы вместо этого было это:

<AssemblyOriginatorKeyFile>$(StrongNameKeyFile)</AssemblyOriginatorKeyFile>

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

У нас также есть переменные, определенные в файлах make, и к ним также можно получить доступ в csproj. Они используются для указания местоположений ссылочных dll, поэтому они могут отличаться на машинах разработки и сборки. Я знаю, что они установлены, так как ссылки выводятся правильно, и все компилируется, но если я попытаюсь использовать одну из этих переменных в элементе AssemblyOriginatorKeyFile, тогда она оценивается как пустая в этом элементе, но работает в элементе ссылки.

Почему это может быть? Является ли AssemblyOriginatorKeyFile каким-то особым образом обработанным? Как я могу отследить причину этого?


person Sam Holder    schedule 04.08.2010    source источник
comment
Является ли $(StrongNameKeyFile) относительным путем к каталогу проекта?   -  person Julien Hoarau    schedule 05.08.2010
comment
Нет, $(StrongNameKeyFile) — это абсолютный путь к файлу ключа.   -  person Sam Holder    schedule 05.08.2010
comment
Я думаю, что AssemblyOriginatorKeyFile должен быть путем относительно файла проекта.   -  person Julien Hoarau    schedule 06.08.2010
comment
но он отлично работал с $(EnvironmentVariable)TheKeyName.snk, который также был абсолютным путем.   -  person Sam Holder    schedule 09.08.2010


Ответы (1)


Нет веской причины, по которой это должно происходить - как вы знаете, обычно это просто работает; скорее всего что-то в цепочке упало на пол.

Одна вещь, которую можно попробовать, — это явно передать его через /p:StrongNameKeyFile=XX — это устранит переменные среды и их правильное распространение из ваших запросов.

Другая возможная вещь заключается в том, что что-то затирает переменную, поскольку имя используется для чего-то еще?

Запустите с параметром /v:diag, и вы получите дампы всех входных данных и/или переменных по мере их изменения.

Или, если в V4, используйте Отладчик MSBuild

И купите Hashimi et al MSBuild book

person Ruben Bartelink    schedule 05.08.2010
comment
спасибо, /v:diag может быть именно тем, что я ищу. Я попробую это как можно скорее. - person Sam Holder; 05.08.2010