web-dev-qa-db-ja.com

TFS 2013でのビルドは失敗しましたが、ローカルで問題ありません

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

以下に要約を示します。

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)
26
user1108948

TFS 2013ビルドサーバーは、 CodeTasksFactoryがMicrosoft.Build.Tasks.v4.0.dllではなくMicrosoft.Build.Tasks.v12.0.dll にあるMSBuild 12.0を使用しています。

理想的には、次のことを実行する必要があります。

1)NuGet.targetsファイルを開きます:C:\ Builds\1\xxxx\FTP Processor(New)\ src.nuget\nuget.targets

2)古いDLLを参照するタスクを特定します。

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

3)その後、次のように将来的に証明します。

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

VS2013の時点で、C:\ Program Files(x86)\ MSBuild\12.0\Bin \からMSBuildを実行する必要があります

c:\ Windows\Microsoft.NET\Framework64\v4.0.30319からではありません。見る

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

ソース: http://gyorgybalassy.wordpress.com/2013/12/31/msb4175-the-task-factory-codetaskfactory-could-not-be-loaded/

それは私のために問題を解決しました。

4
Ranadheer Reddy

たくさんの調査と「ハック」を試した後、私は、nuget restoreの正確なメカニズムを理解しました。 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へのすべてのプロジェクトおよびソリューション参照を削除して、自動パッケージ復元を利用できます。ここで説明するプロセスを多少自動化します。

スクリプトを実行するディレクトリを再帰的に処理し、どこかにある可能性のあるソリューションに対して実行します。注意して楽しんでください! (破損するものについては責任を負いません)

この件に関するいくつかの良いリンク:

2
Korayem

同様の問題がありました。古いDelphi.netコードをビルドするため、Visual Studio 2015に付属するv14バージョンではなく、フレームワークに付属する古い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>  
0
flobadob