MSBuild обрабатывает циклические зависимости - PullRequest
2 голосов
/ 18 марта 2012

Я новичок в MSBuild.Просто начал пробовать это два дня назад, а сейчас я просто проверяю это.Я столкнулся с проблемой, когда я получаю эту ошибку:

"c:\Users\martinslot\Documents\Visual Studio 2010\Projects\MultifileAssembly\SpecializedBuild.xml" (BuildNumberUtil target) (1) ->
  c:\Users\martinslot\Documents\Visual Studio 2010\Projects\MultifileAssembly\SpecializedBuild.xml(4,34): error MSB4006: There is a circular dependency in t
he target dependency graph involving target "BuildNumberUtil".

Мой скрипт MSBuild выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <Target Name="BuildNumberUtil" DependsOnTargets="BuildStringUtil" >
    <Message Text="=============Building modules for NumberUtil============="/>

    <Csc TargetType="Module" Sources="NumberUtil/DoubleUtil.cs; NumberUtil/IntegerUtil.cs" AddModules="/StringUtil/StringUtil"/>
    <Copy SourceFiles="@(NetModules)" DestinationFolder="../Output/Specialized"/>

  </Target>

  <Target Name="BuildStringUtil" DependsOnTargets="BuildNumberUtil" >
    <Message Text="=============Building modules for StringUtil============="/>

    <Csc TargetType="Module" Sources="StringUtil/StringUtil.cs;" AddModules="/NumberUtil/IntegerUtil;/NumberUtil/DoubleUtil"/>
    <Copy SourceFiles="@(NetModules)" DestinationFolder="/Output/Specialized"/>

  </Target>
</Project>

Я понимаю проблему, на самом деле я создал этот небольшой примересли бы MSBuild понял и мог как-то исправить проблему.Как мне решить эту проблему?

Моя проблема состоит в том, что две цели компилируют модули, которые полагаются друг на друга.У кого-нибудь здесь есть решение о том, как справиться с такой проблемой с MSBuild?Может быть, я неправильно это понимаю?

Ответы [ 3 ]

5 голосов
/ 18 марта 2012

Вы просто не можете создавать проекты с круговыми зависимостями. Как ты мог? Что вы строите первым? Там может быть какой-то эзотерический, запутанный, неправильный способ сделать это, но зачем это делать? Круговые зависимости обычно указывают на недостаток конструкции. Исправьте дизайн, и у вас больше не будет круговой проблемы с зависимостями.

1 голос
/ 09 марта 2014

Возможно создание кольцевых модулей в рамках MSBuild и Visual Studio; однако при этом существует очень ограниченный набор ситуаций, в которых это будет допустимо.

Один из ключевых способов сделать это, если вы планируете использовать Xaml в своем коде, это удалить аспект Sources тега Csc и сгенерировать собственный файл .response, который фактически указывает на код Вы хотите ввести. В атрибутах тега Csc вы сами указываете этот файл в атрибуте ResponseFiles.

В вашем файле .response вы затем разбите свое приложение на компоненты сборки и сетевого модуля, убедившись, что сначала всегда включаются файлы сборки ядра. Обычно атрибуты тега Csc напрямую переводятся в параметры командной строки Csc.exe. Имена параметров не всегда совпадают. Ради разрешения лучше использовать полные, не относительные пути при обращении к файлам (например, частичный , .response ниже):

"X:\Projects\Code\C#\Solution Name\InternalName\ProjectName - InternalName\SearchContexts\StringSearchType.cs"
"X:\Projects\Code\C#\Solution Name\InternalName\ProjectName - InternalName\UI\Themes\Themes.cs"
/target:module /out:bin\x86\Debug\InternalName.UI.dll
"X:\Projects\Code\C#\Solution Name\InternalName\ProjectName - InternalName\UI\EditDatabaseImageControl.xaml.cs"
"X:\Projects\Code\C#\Solution Name\InternalName\ProjectName - InternalName\obj\x86\Debug\UI\EditDatabaseImageControl.g.cs"

Вы заметите, что в конечном итоге вы объедините несколько наборов целей в один, и я сам включил сгенерированный xaml-код. Это частично, почему вы удаляете аспект Sources, так как часть генератора страниц Xaml задачи MSBuild автоматически внедряет информацию в набор @ (Compile). Поскольку существует конфигурация отладки / выпуска, в области, где вы определяете файл ответов для использования, я создаю две версии ответа (поскольку я использую шаблон T4):

ResponseFiles="$(CompilerResponseFile);InternalName.$(Configuration).response"

Если вы намеревались включить в свой код более одной платформы, вам, вероятно, потребуются файлы ответов C * P, где C - это количество конфигураций (Debug | Release), а P - количество платформ (x86, x64, AnyCpu). ). Решением такого рода, вероятно, будет только вменяемый метод с использованием генератора.

Краткая версия этого: можно создавать циклические модули, если вы можете гарантировать, что вы скомпилируете все это за один шаг. Чтобы обеспечить поддержку функциональности сборки, которая предоставляется вам на этапе сборки Xaml, лучше всего начать с обычного проекта C # и создать собственный файл .Targets из $(MSBuildToolsPath)\Microsoft.CSharp.targets в теге <Import .... возле дна. Вам также, вероятно, понадобится вторичный csproj для целей проектирования, поскольку большая часть intellisense теряется при использовании этого временного решения (или используйте атрибут csproj Condition, где цель выбирается с помощью установленного вами флага). Вы также заметите, что некоторым редакторам Xaml не нравится привязка к пространствам имен сетевых модулей, поэтому, если вы привязываетесь к типам в сетевом модуле, вам, вероятно, придется делать их в коде (я не тестировал обходные пути для этого, так как обычно обходят статическую привязку пространства имен)

По какой-то причине во всем этом .baml скомпилированные файлы .xaml неявно понимаются компилятором Csc, я не смог выяснить, откуда он это выводит из аргумента команды, или если он просто неявный дизайн. Если бы мне пришлось угадывать, что они выводятся из файлов g.cs, связанных с тем, что вы включаете в список включенных файлов.

0 голосов
/ 05 апреля 2016

Обратите внимание, что это произошло для веб-приложения (либо стандартного веб-приложения ASP.NET, либо приложения ASP.NET MVC), и исправление этой проблемы следует удалить в файле «.csproj», приведенном ниже.

<PropertyGroup>
  <BuildDependsOn>
    $(BuildDependsOn);
    Package
  </BuildDependsOn>
</PropertyGroup>
...