2011-06-14 77 views
1

在我們的構建服務器上使用NAnt和CCNet。最近當我一直在做本地部署時,我得到了似乎與Linq,泛型和代表連接的構建錯誤。Linq導致構建錯誤

這裏有結果:

[nant] C:\Test\buildfiles\build.build 
Buildfile: .......... 
Target framework: Microsoft .NET Framework 3.5 
Target(s) specified: build 

build: 
    [csc] Compiling 192 files to 'C:\TEST\bin'. 
    [resgen] Read in 78 resources from 'C:\Test\Resources'. 
    [csc] c:\Test\src\randomfile.cs<10,10>: error CS0411: The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult><System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TResult>>' cannot be inferred from the usage. Try specifying the type arguments explicitly 

在我的機器,我可以沒有任何問題(VS2010)建設。我使用最新的NAnt 0.91b。


更新:

該項目的目標框架3.5。 下方是(在第一種方法的返回部分)生成錯誤的代碼:

public static RoleTypeIdAndName[] TranslateRoleTypes(RoleType[] roleTypes) 
{ 
    return roleTypes.Select(TranslateRoleType).ToArray(); 
} 

public static RoleTypeIdAndName TranslateRoleType(RoleType roleType) 
{ 
    return new RoleTypeIdAndName 
      { 
       Name = roleType.Name, 
       RoleTypeId = roleType.RoleTypeId 
      }; 
} 
+4

你一定,一定,一定要包括代碼詢問一個編譯錯誤 – 2011-06-14 15:11:37

+4

當你說你'使用VS2010 - 這是否意味着你在CCNet服務器上本地定位了.NET 4,3.5? – Rup 2011-06-14 15:13:02

+0

你在那個cc任務中使用MSBuild.exe(.NET 3.5 vs .NET 4.0)的正確路徑嗎? – BrokenGlass 2011-06-14 15:13:28

回答

1

當您使用vs2010時,您需要將其設置爲在nant腳本中的目標框架4.0,或者您可以直接調用msbuild的正確版本(4.0)並傳入您的解決方案文件。

我們當前構建腳本確實會這樣:

<target name="msbuild" depends="create.common.assembly.info"> 
    <echo message="Compiling ${msbuild.workingpath}\${solution.path}"/> 
    <echo message="Build base path ${msbuild.path}"/> 

    <exec program="msbuild.exe" basedir="${msbuild.path}" workingdir="${msbuild.workingpath}"> 
     <arg value="/p:Configuration=${project.configuration}" /> 
     <arg value="/v:q" /> 
     <arg value="/p:trackfileaccess=false" /> 
     <arg value="/t:Clean"/> 
     <arg value="${solution.path}"/> 
    </exec> 

    <exec program="msbuild.exe" basedir="${msbuild.path}" workingdir="${msbuild.workingpath}"> 
     <arg value="/p:Configuration=${project.configuration}" />  
     <arg value="/v:q" /> 
     <arg value="/p:trackfileaccess=false" /> 
     <arg value="/t:Rebuild"/> 
     <arg value="${solution.path}"/> 
    </exec> 
    <property name="msbuild.output.file" value="${msbuild.workingpath}/msbuild-output.xml"/> 
    <move if="${file::exists(msbuild.output.file)}" file="${msbuild.output.file}" todir="${log.path}" failonerror="false" overwrite="true" /> 
    </target> 

${msbuild.path}<property name="msbuild.path" value="C:\Windows\Microsoft.NET\Framework\v4.0.30319" />

+0

如果我將目標框架設置爲4.0,則NAnt似乎在使用4.0中的dll:s,並且由於3.5與4.0之間的差異導致構建失敗。 – Mattias 2011-06-15 11:31:59

+1

@Mattias我與nant和msbuild任務有類似的問題。這就是爲什麼我搬到使用exec任務,我手動傳遞msbuild參數。這樣你會有更多的控制。在我當前的構建腳本中,我甚至沒有指定框架。 – marto 2011-06-15 12:27:25

+0

如何讓NAnt使用它而不是普通的?我認爲這是使用的語法。 – Mattias 2011-08-22 09:34:56

0

沒有看到你的代碼,我想這是對this page提到的情況之一。

+0

什麼是正確的投票,福爾摩斯?我回復時沒有發佈任何代碼。 ??? – 2011-06-14 15:32:44