2013-12-18 14 views
25

コードをチェックインすると、TFS 2013によって自動的にソリューションが構築されました。ローカルVS 2013では正常ですが、TFSでは失敗しました。TFS 2013でビルドできませんでしたが、ローカルで問題ありません

ここに概要があります。

Summary 
FTPProcessor | Any CPU 
1 error(s), 56 warning(s) 
$/xxxx/NewServiceHost/New-Branch/NewServiceHost/packageRestore.proj - 0 error(s), 0 warning(s) 
$/xxxx/NewServiceHost/New-Branch/GenericWindowsServices.sln - 1 error(s), 56 warning(s) 
C:\Builds\1\xxxx\FTP Processor (New)\src\.nuget\nuget.targets (71): The task factory "CodeTaskFactory" could not be loaded from the assembly "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Build.Tasks.v4.0.dll". Could not load file or assembly 'file:///C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Build.Tasks.v4.0.dll' or one of its dependencies. The system cannot find the file specified. 
Other Errors 
1 error(s) 
Exception Message: MSBuild error 1 has ended this build. You can find more specific information about the cause of this error in above messages. (type BuildProcessTerminateException) Exception Stack Trace: at System.Activities.Statements.Throw.Execute(CodeActivityContext context) at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation) 

答えて

53

あなたのTFS 2013のビルドサーバーは、MSBuildの12.0むしろMicrosoft.Build.Tasks.v4.0.dllよりCodeTasksFactory exists in Microsoft.Build.Tasks.v12.0.dllを使用しています。

1)あなたのNuGet.targetsファイルを開きます: C:

は、理想的には、以下を実行する必要があります\ビルド\ 1 \ XXXX \ FTPプロセッサ(新)\ src.nuget \ nuget.targets

2)古いDLLを参照しているタスクを特定します。そのような

<UsingTask AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" TaskFactory="CodeTaskFactory" > 
... 

3)次に、将来の証明にそれを:VS2013のよう

<UsingTask AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" TaskFactory="CodeTaskFactory" > 
... 
+1

実際には、nuget.targetsファイルを変更できます。しかし、csprojファイルのToolsVersion値を変更する必要はありますか?実際に私のローカルマシンVS 2013を使用して、私のTFSは古いバージョンを使用しています。 –

+0

.csprojファイルの値を変更することもできますが、msbuild.exeを呼び出すときにtoolsversionスイッチを使用して変更することもできます。 http://msdn.microsoft.com/en-us/library/bb383985.aspx – Nicodemeus

+0

@ Zenuka、更新します、ありがとうございます。 – Nicodemeus

4

、 あなたはCからのMSBuildを実行する必要があります:\プログラムファイル(x86の)\ MSBuildの12.0 \ビン\

\

C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319からではありません。 http://gyorgybalassy.wordpress.com/2013/12/31/msb4175-the-task-factory-codetaskfactory-could-not-be-loaded/

が、それは私のために問題を解く:

http://blogs.msdn.com/b/visualstudio/archive/2013/07/24/msbuild-is-now-part-of-visual-studio.aspx

ソースを参照してください。

2

多くの研究と「ハック」の束を試した後、私はナゲットの復元の正確な仕組みを理解しました。結局のところ、Nuget 2.7以降ですべてが変更されており、 ".nuget"フォルダと関連するnuget.exeとnuget.targetを含める必要はなくなりました。

ビルドプロセスを修正し、最新の推奨アプローチを使用するには削除

  • 移動nuget.configの.slnファイルと同じフォルダパスになるように
  • 「.nuget」
  • の.slnファイルにそのフォルダへの参照を削除して完全に
  • をフォルダ:、私は次のようでした任意の.csprojファイルから次の行を削除してください。

-

<RestorePackages>true</RestorePackages> 
<Import Project="$(SolutionDir)\.nuget\nuget.targets" /> 
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> 

-

プロジェクトのソリューションは、多くのファイルを持っている場合、これはいくつかの時間を取ることができるか、あなたは、Visual Studio 2013との前で構築された多くのプロジェクトに取り組んでいます。

良いニュースは、任意のフォルダに再帰的に上記を適用するPowerShellのスクリプトがありますされています。要するに

は、それができるように、「Nugetパッケージの復元の有効化」反転します新しいパッケージの復元方法を使用するには

Visual Studio 2013では、自動パッケージ復元が IDE(およびTFSビルドプロセス)の一部になりました。この方法は、以前のmsbuild統合パッケージ復元の よりも信頼性が高くなります。 に各ソリューションにnuget.exeをチェックインする必要はなく、 追加のmsbuildターゲットは必要ありません。ただし、 に関連するファイルがプロジェクトの古いパッケージの復元方法に関連する場合、Visual Studioは 自動パッケージ復元をスキップします。 (この動作はすぐに に変更される可能性があります。うまくいけばそれがあります)。

このスクリプトを使用すると、nuget.exe、nuget.targets、およびすべての プロジェクトとnuget.targetsへのソリューション参照を削除して、 自動パッケージ復元の利点を得ることができます。ここで説明する プロセスは、多少なりとも自動化されています。

スクリプトを実行するディレクトリから再帰し、 をどこかのソリューションに送信します。注意してくださいと 楽しくて!件名に良いリンクのカップル

(壊すものについては責任を負いません):

0

私は同様の問題がありました。ビジュアルスタジオ2015に付属しているv14のバージョンではなく、古いDelphi.netコードをビルドしているので、フレームワークに付属の古いmsbuildを使用することになります。私たちのvcxprojファイルは、Microsoft.Build.Tasks.v12.0.dllに依存するタスクを持つ自動コード解析ターゲットをトリガーしています。私はそれをコピーしてvcxprojの上部に貼り付け、dllへのパスを微調整することでそのタスクをオーバーライドすることができました。元のタスクは "C:¥Program Files(x86)¥MSBuild¥Microsoft¥VisualStudio¥v14.0¥CodeAnalysis¥Microsoft.CodeAnalysis.Targets"にあります。つまり、プロジェクトの問題タスクをオーバーライドすることができます。

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

    <!-- override a task which we can't use with the old msbuild --> 
    <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"> 
    <ParameterGroup> 
     <EnvKey ParameterType="System.String" Required="true" /> 
     <EnvValue ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
     <Using Namespace="System" /> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      try { 
       Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process); 
      } 
      catch { 
      } 
     ]]> 
     </Code> 
    </Task> 
    </UsingTask> 
関連する問題