Как прочитать свойство MSBuild в данном проекте во время выполнения? - PullRequest
0 голосов
/ 01 июля 2019

Я хочу получить доступ к переменной MSBuild внутри модульного теста, который является проектом библиотеки классов .NET 4.5 (classic csproj), но мне не удалось найти какие-либо статьи, обсуждающие способ передачи значений из MSBuild в контекст выполнения.

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

Есть ли известное решение для чтения свойства MSBuild изнутри проекта DLL во время выполнения?Могут ли свойства MSBuild быть «переданы как параметры» во время выполнения каким-либо образом?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Я наконец заставил его работать, используя ту же задачу генерации кода, которая используется по умолчанию в проектах .Net Core. Единственное отличие состоит в том, что мне пришлось вручную добавить Target в файл csproj для его работы, поскольку создание кода не является стандартным для фреймворковых проектов:

<Target Name="BeforeBuild">
  <ItemGroup>
    <AssemblyAttributes Include="MyProject.SolutionFileAttribute">
    <_Parameter1>$(SolutionPath)</_Parameter1>
    </AssemblyAttributes>
  </ItemGroup>
  <WriteCodeFragment AssemblyAttributes="@(AssemblyAttributes)" Language="C#" OutputDirectory="$(IntermediateOutputPath)" OutputFile="SolutionInfo.cs">
    <Output TaskParameter="OutputFile" ItemName="Compile" />
    <Output TaskParameter="OutputFile" ItemName="FileWrites" />
  </WriteCodeFragment>
</Target>

Строки с Compile и FileWrites предназначены для того, чтобы он хорошо играл с чистыми и тому подобными (см. Связанные ответы в моих комментариях выше). Все остальное должно быть достаточно интуитивно понятным.

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

Assembly
    .GetExecutingAssembly()
    .GetCustomAttribute<SolutionFileAttribute>()
    .SolutionFile

Это работает очень хорошо и позволяет мне избегать любых жестко запрограммированных поисков файла решения.

0 голосов
/ 06 июля 2019

Я думаю, у вас есть несколько вариантов:

  • Используйте переменные окружения, как вы уже предлагали. Для этого может потребоваться специальное задание, но его легко выполнить , без каких-либо дополнительных сборок с вашей стороны. Требуемая глобальная видимость может быть проблемой; Рассмотрим, например, параллельные сборки на машине CI.
  • Напишите фрагмент кода во время сборки и включите его в полученную сборку (что-то похожее на то, что вы уже нашли под ссылкой , которую вы предложили в ваших комментариях.
  • Записать файл (даже app.config) во время сборки, который содержит настройки, отражающие свойства MSBuild, которые вам необходимы; прочитайте их во время тестовых прогонов.

(Кстати, что не имеет большого смысла, так это попытаться снова прочитать файл проекта MSBuild во время выполнения (с использованием Microsoft.Build ). На этот раз это большая работа для начала Мало за что ИМХО. И что еще важнее, вам, скорее всего, - в зависимости от сложности и зависимостей ваших свойств - необходимо убедиться, что вы вызываете библиотеки MSBuild с теми же свойствами, которые присутствовали во время фактической сборки. Возможно, это может вернуть вас обратно, если бы вы начали.)

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

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

На самом деле я сделал это для более крупного проекта, над которым я работал. По сути, у нас были разные среды (строки подключения к базе данных и т. Д.), И мы выбирали те в качестве шага посткомпиляции путем копирования myenv.config в default.config. Тесты будут когда-либо только искать файл с именем default.config и выбирать те параметры, которые там установлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...