У меня есть несколько проектов C ++ (.vcxproj) для VS2017, которые производят динамические библиотеки (DLL), которые обрабатываются как «плагины» (т.е. они динамически загружаются приложением).
ИногдаЯ хочу изменить имена созданных DLL-файлов на основе какого-либо списка в текстовом файле (формат может быть изменен):
ProjName1;DLL1
ProjName2;DLL2
...
В первом столбце указано имя проекта ($(ProjectName)
), а во втором - для желаемогоИмя DLL ($(TargetName)
).
Я хочу, чтобы этот файл анализировался во время сборки, поэтому каждое прочитанное имя DLL входит в $(OutputFile)
соответствующего проекта.
Например,ProjName1.vcxproj
будет иметь следующий фрагмент (во время сборки):
<Link>
<OutputFile>$(OutDir)DLL1$(TargetExt)</OutputFile>
</Link>
Я предполагаю, что для этого могут быть использованы определенные возможности msbuild
(например, ReadLinesFromFile task и Задача FindInList ), но я не уверен, как соединить эти кусочки).
Есть несколько примеров такой автоматизации, которые следует рассмотреть, хотя я сомневаюсь, что они имеют отношение к формату .vcxproj:
Простой подход заключается в изменении содержимого каждого файла .vcxproj для соответствия списку (либо вручную, либо с помощью какого-либо сценария).
Есть ли другие варианты?
Обновление 1 : мне удалось реализовать частичное решение, основанное на отдельном файле с именем DLL ( имя модуля ) для каждого проекта (см. Функции свойств для получения дополнительных советов).
С помощью таблиц свойств в моем случае было легко «внедрить» исправление во все проекты:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup Condition="exists('$(MSBuildProjectDirectory)\_MODULE.name')">
<ModuleName>$([System.IO.File]::ReadAllText('$(MSBuildProjectDirectory)\_MODULE.name'))</ModuleName>
<TargetName>$(ModuleName)</TargetName>
</PropertyGroup>
...
</Project>
Хотяон работает довольно хорошо, подход не отвечает моим потребностям - я бы хотел, чтобы все имена модулей были в одном файле.