簡體   English   中英

MSBuild處理循環依賴

[英]MSBuild handling circular dependencies

我是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處理此類問題有解決方案嗎? 也許我以錯誤的方式構造了這個?

您根本無法構建具有循環依賴項的項目。 你怎么能? 您首先建立哪個? 可能有一些深奧的,令人費解的,錯誤的方法,但是為什么要這樣做呢? 循環依賴性通常表示設計缺陷。 修復設計,您不再有循環依賴問題。

可以在MSBuild和Visual Studio的范圍內構造循環模塊。 但是,這樣做的局限性非常有限。

如果您打算在代碼中使用Xaml,執行此操作的一種關鍵方法是刪除Csc標記的Sources方面,並生成自己的.response文件,該文件實際上指向您要注入的代碼。 Csc標記屬性中,您可以在ResponseFiles屬性中Csc指定此文件。

然后,在您的.response文件中,將您的應用程序分解為程序集和netmodule組件,並確保始終包含核心程序集的文件。 通常, Csc標記的屬性直接轉換為Csc.exe命令行參數。 參數名稱並不總是匹配。 為了解決問題,在引用文件時最好使用完整的,非相對的路徑(例如,下面的partial.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"

您會注意到,這最終將將多組Target合並為一個,並且我自己包含了xaml生成的代碼。 這是您刪除Sources方面的部分原因,因為MSBuild任務的Xaml頁面生成器部分會自動將信息注入@(Compile)集中。 由於存在調試/發布配置,因此在定義要使用的響應文件的區域中,我創建了兩個版本的響應(因為我使用的是T4模板):

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

如果您打算在代碼中包含多個平台,則可能需要C * P響應文件,其中C是配置數(Debug | Release),P是平台數(x86,x64,AnyCpu)。 這種解決方案可能只是使用生成器的合理方法。

簡短的版本:只要您可以保證一步一步地編譯完所有模塊,就可以創建循環模塊。 為確保您維護Xaml構建步驟提供的構建功能,最好的選擇是從常規C#項目開始,然后從$(MSBuildToolsPath)\\Microsoft.CSharp.targets創建自己的.Targets文件。在底部附近的<Import ...標簽中。 您還可能出於設計目的需要使用輔助csproj,因為使用此解決方法(或使用csproj Condition屬性(其中設置的目標由您設置的某些標志選擇了目標)時,會丟失大部分智能感知)。 您還會注意到某些Xaml編輯器似乎不喜歡綁定到netmodule命名空間,因此,如果您綁定到netmodule中的類型,則可能必須在代碼隱藏中進行(因為我沒有測試解決方法,因為通常圍繞靜態名稱空間綁定的方法)

由於種種原因, Csc編譯器會隱式理解.baml編譯的.xaml文件,我無法弄清楚它是從命令參數派生的,還是僅出於設計目的而隱含。 如果我不得不猜測它們是由與包含文件列表中包含的內容相關聯的g.cs文件推斷出來的。

請注意,這是針對Web應用程序(ASP.NET標准Web應用程序或ASP.NET MVC應用程序)發生的,並且針對此問題的解決方案將在“ .csproj”文件的以下行中刪除。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM