Как найти текущий файл в MSBuild

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

Кто-нибудь знает способ найти текущий файл? (т.е. когда основной файл MSBuild импортирует вторичный файл. Каков путь к вторичному файлу изнутри этого файла.)

Я пытаюсь зарегистрировать свой файл в HKEY_LOCALMACHINE \ Software \ Microsoft \ VisualStudio \ 8.0 \ MSBuild \ SafeImports, но путь к файлу не является постоянным на каждом из компьютеров моих коллег, и он импортируется из нескольких разных проектов, поэтому я жестко запрограммировал относительный путь - тоже не лучшая идея.

Если есть способ получить текущий рабочий каталог, он тоже будет работать (рабочий каталог переключается при каждом импорте, и я думаю, что могу его сохранить)


person Vaccano    schedule 29.05.2009    source источник


Ответы (2)


Не существует надежных способов идентифицировать «текущий файл». Когда MSBuild обрабатывает файл, он может импортировать несколько других файлов, конечным результатом является единственное полное представление файла в памяти. Когда цели выполняются, они не знают, в каком файле они были объявлены.

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

Только MSBuild 4.0

Если вы используете MSBuild 4.0, то есть Visual Studio 2010 / .NET 4.0 (который также может ориентироваться на .NET 2.0 / 3.0 / 3.5). Теперь у вас есть эти свойства, которые можно использовать для этой конкретной цели:

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot

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

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

person Sayed Ibrahim Hashimi    schedule 01.06.2009
comment
Я этого боялся. Я помню, как читал это в вашей книге, но мне также показалось, что я видел свойство, которое сообщает мне текущий файл. Или я надеялся, что есть способ сохранить в рабочем каталоге (поскольку он меняется с каждым импортом). Хорошо, я просто передам значение, которое говорит, что если файл есть, я просто не хотел иметь внешнюю зависимость. - person Vaccano; 01.06.2009
comment
Да, это может быть проблемой. Чтобы избежать этого, вы можете подтвердить свои предположения в качестве цели проверки. Поэтому, если свойство не заполнено, просто выдайте ошибку, указав, что это необходимо. Я писал об этом в главе 7. - person Sayed Ibrahim Hashimi; 02.06.2009
comment
Обратите внимание, что с MSBuild 4.0 это больше не проблема. См. Ответ пользователя user8657 ниже. - person C Johnson; 07.01.2012

В 4.0+ вы можете использовать такие свойства, как $ (MSBuildThisFile), чтобы сделать именно это. См. здесь

person cheerless bog    schedule 17.07.2011
comment
Зарезервированные свойства MSBuild (далее ЗДЕСЬ) - не имеют свойства MSBuildThisFile. - person Michael Freidgeim; 21.08.2011
comment
неправильный. Его нет в документации на MSDN, но кто-то предоставил кучу дополнительных недостающих свойств в примечаниях пользователя внизу. - person C Johnson; 07.01.2012