0

Я пытаюсь добавить несколько простых задач MSBuild в проект Visual Studio (VS 2012 Express) - в частности, создать подкаталог, а затем скопировать некоторые файлы в подкаталог каталога вывода, готового для упаковки.Поддерживает ли Visual Studio добавление задач MSBuild к проектам?

Я вижу, что VS поддерживает пользовательские шаги сборки, которые являются вызовами командной строки. Однако, поскольку VS основан на MSBuild, их можно будет добавить как MSBuild tasks, например the Copy Task в AfterBuild pre-defined target.

Я не могу найти способ добавить такие задачи в рамки Visual Studio. The documentation only talks about it from an MSBuild perspective, not how it works within Visual Studio's UI. Он также, похоже, не обсуждает свойства, которые ссылаются на вывод сборки и т. Д.; предположительно это just those used by msbuild its self.

Есть ли поддержка для управления задачами MSBuild в пользовательском интерфейсе Visual Studio, и это просто искалечено из моей версии Express? Или мне нужно взломать файл проекта XML, чтобы добавить задачи MSBuild? Поддерживается ли это и как это должно быть сделано?

Я привык работать с Eclipse и Ant или Maven, где все это поддерживается в среде IDE, хотя, конечно, вы можете напрямую взломать XML. Не найти никакого интерфейса для управления задачами MSBuild в Visual Studio довольно сложно. Я пропускаю очевидное или искалеченное, используя бесплатное издание?

+0

Помещение «Visual» Visual Studio в редактирование файлов MSBuild было бы серьезным делом с низкой отдачей. Он, однако, поддерживает его достаточно хорошо, просто используйте File + Open + File, выберите файл проекта. Нажмите стрелку на кнопке «Открыть», выберите «Открыть с» и выберите редактор XML. Возможно, вам придется выгрузить проект, если он загружен в настоящий момент. Остерегайтесь, что это похоже на подростковый секс, одна ошибка, и вы будете поддерживать ее всю оставшуюся жизнь. –

+0

Я редактирую XML-файлы в Notepad ++ и не должен сначала выгружаться. При изменении перезагрузка VS или подключаемый модуль VSCommands обнаруживает и перезагружает все решение. Только порой для включенного файла (например, реквизита) мне нужно закрыть решение вручную; даже при этом, создание видит последние файлы, даже если среда IDE не обновилась. –

ответ

2

Для проектов C++, вы можете использовать свойство

<CppCleanDependsOn>DeleteOutputs;$(CppCleanDependsOn)</CppCleanDependsOn> 

вместо определения цели BeforeClean, как вы делали.

Из чего я читаю, CallTarget следует избегать. В вашем примере вы должны использовать DependsOnTargets для этого, как вы видите во многих фиктивных целях в файлах, поставляемых MS. Аналогичный механизм функции, когда цель просто «называет» другие цели, выполняется с помощью DependsOnTargets. Поток не совсем то же самое, что и процедурное программирование.

Intellisense: Я никогда не использую его. Это верно только для условных дополнительных файлов Include в файле реквизита? Идите и отредактируйте запись в файле proj, где была установлена ​​IDE, если вы отредактируете свойство в среде IDE только с одной выбранной конфигурацией.

0

Я использую VS2010 Pro, и он не раскрывает цель AfterBuild, по крайней мере, в проектах на C++, что я и делаю. Как видите, в нем есть «События», которые, в соответствии с тем, что я прочитал, предназначены для обратной совместимости с преобразованными проектами из VSBuild. Я согласен, задача MSBuild, а не командный скрипт - это путь.

Забудьте о пользовательском интерфейсе. Он создан для поддержки бесплатного редактирования файлов XML и продолжения использования интерфейса, поскольку он уважает то, что у вас там, и использует метки для своих собственных материалов, чтобы он мог его обновить.

Чтобы сохранить его в чистоте, вы можете использовать страницу свойств; автономный XML-файл с именем * .props и помещать в него то, что вы хотите. Затем добавьте этот файл реквизита в проекты с использованием пользовательского интерфейса. Вы не будете вручную редактировать файл проекта, который поддерживает пользовательский интерфейс, и он не будет касаться файла реквизита, если вы не просмотрите представление менеджера свойств и не откроете его явно.

О, я также нахожу, что вижу дополнительные стандартные цели, такие как Пакет и Публикация. Возможно, они не используются в вашем проекте, но вы можете использовать эти точки входа в любом случае.

+0

Да, я уже использовал листы свойств. Они разочаровываются, хотя, в частности, кажется, что если вы используете условия для свойств или групп свойств, которые влияют на такие вещи, как пути заголовков, IntelliSense имеет корову и не может найти заголовки, даже несмотря на то, что сама по себе она преуспевает. –

+0

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

0

(После того, как кучка больше чтения я узнал, как это работает):

Visual Studio, похоже, не подвергать расширенные возможности редактирования проекта MSBuild, хотя современные vcxproj файлы только файлы проекта MSBuild с кучей дополнительных помеченных свойств и других записей для особенностей среды разработки Visual Studio. Таким образом, вы должны взломать проект XML.

Чтобы сделать его более чистым, добавьте только одну строку в свой фактический файл vcxproj - вставьте файл .targets, который содержит остальную часть ваших настроек сборки. например, незадолго до конца файла проекта, вставки:

<Import Project="pg_sysdatetime.targets" /> 
</Build> 

Теперь создайте файл .targets с той же структурой, как и любой другой проект MSBuild.Вот мое от the project I've been working on:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- MSBuild extension targets for Visual Studio build --> 
    <PropertyGroup> 
    <DistDir>pg_sysdatetime_pg$(PGMAJORVERSION)-$(Configuration)-$(Platform)</DistDir> 
    </PropertyGroup> 
    <ItemGroup> 
    <DocFiles Include="README.md;LICENSE"/> 
    <ExtensionSourceFiles Include="pg_sysdatetime--1.0.sql;pg_sysdatetime.control"/> 
    <ExtensionDll Include="$(TargetDir)\pg_sysdatetime.dll"/> 
    </ItemGroup> 
    <Target Name="CopyOutputs"> 
    <Message Text="Copying build product to $(DistDir)" Importance="high" /> 
    <Copy 
     SourceFiles="@(DocFiles)" 
     DestinationFolder="$(DistDir)" 
     /> 
    <Copy 
     SourceFiles="@(ExtensionDll)" 
     DestinationFolder="$(DistDir)\lib" 
     /> 
    <Copy 
     SourceFiles="@(ExtensionSourceFiles)" 
     DestinationFolder="$(DistDir)\share\extension" 
     /> 
    </Target> 
    <Target Name="DeleteOutputs"> 
    <Message Text="Deleting $(DistDir)" Importance="normal" /> 
    <Delete Files="$(DistDir)"/> 
    </Target> 
    <!-- Attach to Visual Studio build hooks --> 
    <Target Name="BeforeClean"> 
    <CallTarget Targets="DeleteOutputs"/> 
    </Target> 
    <Target Name="AfterBuild"> 
    <CallTarget Targets="CopyOutputs"/> 
    </Target> 
</Project> 

Это может содержать whatver задачи MSBuild вы хотите, сгруппированных в цели. Он также может иметь группы свойств, группы элементов и все, что поддерживает MSBuild.

Чтобы интегрировать в Visual Studio, вы добавляете специально именованные цели, которые вызывают то, что вы хотите. Здесь вы можете увидеть, что я определил цели BeforeClean и AfterBuild. Вы можете получить поддерживаемые цели из VS integration docs.

Теперь, когда я строю или перестраиваю, автоматически создается новый каталог, содержащий DLL продукта и кучу статических файлов, готовых к зашифровке. Если бы я хотел, я мог бы добавить пакет Nuget для расширений сообщества MSBuild и использовать задачу Zip, чтобы связать все это с zip-файлом и в конце.

BTW, в то время как вы можете определить свойства в своих .targets файлах, лучше их определить в property sheets. Таким образом, они видны в пользовательском интерфейсе.

+1

Существует действие IDE для добавления .targets в список настроек в самом конце файла * proj. «Add Build Customization», я думаю, будет искать цели и реквизиты с таким же базовым именем и включать их в разные места. –

Смежные вопросы