Я только что закончил создание системы сборки на месте для существующего кода на C++, используя наследуемые листы свойств, которая, как представляется, специфична для продукта Visual C++. Для создания вне места требуется, чтобы многие параметры проекта были изменены, а наследуемые листы свойств позволили мне изменить все необходимые настройки, просто добавив лист свойств в проект. Я переношу нашу команду из C++/MFC для UI в C# и WPF, но мне нужно предоставить такую же функциональность вне места, надеюсь, с таким же удобством. Я не могу найти способ сделать это с помощью проектов C#. Сначала я посмотрел, могу ли я ссылаться на файл целей MsBuild, но не смог найти способ сделать это. Я знаю, что могу просто использовать MsBuild для всего, но это кажется более сложным, чем необходимо. Есть ли способ определить макрос для каталога и использовать его в пути вывода, например?Нестандартные сборки с C#
ответ
Я не совсем уверен, что такое система сборки «вне места», но если вам просто нужна копия скомпилированных файлов (или других ресурсов) в другие каталоги, вы можете сделать это, привязавшись к цели сборки MSBuild.
В наших проектах мы перемещаем скомпилированные библиотеки DLL в папки lib и помещаем файлы в нужные места после завершения сборки. Для этого мы создали пользовательский файл сборки .target, который создает Target
, Property
и ItemGroup
, которые мы затем используем для заполнения нашей внешней выходной папки.
Наш файл пользовательских целей выглядит как это:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectName>TheProject</ProjectName>
<ProjectDepthPath>..\..\</ProjectDepthPath>
<ProjectsLibFolder>..\..\lib\</ProjectsLibFolder>
<LibFolder>$(ProjectsLibFolder)$(ProjectName)\$(Configuration)\</LibFolder>
</PropertyGroup>
<Target Name="DeleteLibFiles">
<Delete Files="@(LibFiles-> '$(ProjectDepthPath)$(LibFolder)%(filename)%(extension)')" TreatErrorsAsWarnings="true" />
</Target>
<Target Name="CopyLibFiles">
<Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ProjectDepthPath)$(LibFolder)" SkipUnchangedFiles="True" />
</Target>
<ItemGroup>
<LibFiles Include=" ">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
</Project>
Файл .csproj в Visual Studio, то интегрируется с этой системой пользовательского целевого файла:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" ... >
...
<Import Project="..\..\..\..\build\OurBuildTargets.targets" />
<ItemGroup>
<LibFiles Include="$(OutputPath)$(AssemblyName).dll">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
<Target Name="BeforeClean" DependsOnTargets="DeleteLibFiles" />
<Target Name="AfterBuild" DependsOnTargets="CopyLibFiles" />
</Project>
В двух словах, это сценарий сборки сначала сообщает MSBuild загрузить наш скрипт пользовательской сборки, затем добавляет скомпилированный файл в ItemGroup LibFiles
и, наконец, связывает наши пользовательские цели сборки, DeleteLibFiles
и CopyLibFiles
, в процесс сборки. Мы устанавливаем это для каждого проекта в нашем решении, поэтому только файлы, которые обновляются, удаляются/копируются, и каждый проект несет ответственность за свои собственные файлы (DLL, изображения и т. Д.).
Надеюсь, это поможет. Приносим извинения, если я неправильно понял, что вы подразумеваете под системой сборки вне места, и это совершенно бесполезно для вас!
Есть ли способ я могу определить макрос для каталога и использовать его в пути выхода
Вы смотрели на предварительной сборки и после сборки событий проекта?
Собственно, события предварительной сборки и пост-сборки, по-видимому, являются единственным местом для добавления команд типа пакетного файла. К сожалению, это не поможет мне создать стандартные каталоги сборки для наших проектов. И, имея эти события, создает пакетные файлы похоже на подход 1980-х годов для современного языка, такого как C#, IMO.
После того, как вы выкапываете еще несколько и экспериментируете, я обнаружил, что вы можете добавить директиву <Import> в ваш .csproj-файл. Когда вы это сделаете, в среде IDE появится диалоговое окно с предупреждением о том, что в вашем проекте есть небезопасная точка входа, но вы можете проигнорировать это, и вы можете сделать это вообще не отображающимся путем редактирования записи реестра. Таким образом, это даст мне способ получить переменные, содержащие пути к каталогам, которые мне нужны, в файл .csproj.
Теперь, чтобы получить ссылку на выход, к сожалению, когда вы добавляете строку «$ (MySpecialPath)/Debug» в поле «Выходной путь» и сохраняете проект, символы $ and() преобразуются в hex, и ваш файл get будет помещен в каталог Debug под каталогом «$ (MySpecialPath)». Arrgghh. Если вы отредактируете файл .csproj в текстовом редакторе, вы можете установить его правильно, но он, похоже, работает до тех пор, пока тег <Import> появится перед <PropertyGroup>, содержащим выходной путь.
Поэтому я считаю, что решение для меня будет состоять в том, чтобы создать стандартный файл OurTeam.targets MsBuild в стандартном расположении, добавить установщик для изменения реестра, чтобы он не отображал предупреждения, а затем создавать собственные шаблоны проектов, которые < Импортируйте файл >, а также установите путь вывода для использования свойств, определенных в файле OurTeam.targets. К сожалению, это больше работы и менее элегантное решение, чем механизм наследования свойств листа на C++.
- 1. MSBuild Inline Task - справочные нестандартные сборки Microsoft
- 2. C нестандартные библиотеки
- 3. Нестандартные нестандартные внешние ключи
- 4. C# Как анализировать нестандартные xml
- 5. Включая нестандартные заголовки C в C++
- 6. Нестандартные окна с Qt
- 7. CMake и нестандартные расширения
- 8. Где объявляются нестандартные функции, хранящиеся в C++?
- 9. Нестандартные URLs с Yii urlManager
- 10. YamlDotNet и нестандартные типы
- 11. Нестандартные оценка и PackedArray
- 12. Rails JSON нестандартные символы
- 13. Нестандартные шрифты в Интернете?
- 14. Нестандартные трубы Popen
- 15. Нестандартные имена - XPath
- 16. Как использовать нестандартные порты?
- 17. Как найти нестандартные записи?
- 18. Декодирование URLEncoded нестандартные символы
- 19. Нестандартные формы: Android
- 20. Нестандартные операции с битами для Java
- 21. Нестандартные маршруты подстраниц .NET MVC2
- 22. Нестандартные оценки и символов Векторы
- 23. HWIOAuthBundle + FosUserBundle - нестандартные формы
- 24. Нестандартные соединения в QlikView?
- 25. exim4 нестандартные порты
- 26. Нестандартные подпись основной() успешно
- 27. Нестандартные маршруты в Rails
- 28. Tidy дает нестандартные HTML
- 29. Нестандартные конструкторы для COM-объектов
- 30. Наиболее полезные нестандартные макросы MSVC++