コードをチェックインすると、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)
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" >
...
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
それは私のために問題を解決しました。
たくさんの調査と「ハック」を試した後、私は、nuget restoreの正確なメカニズムを理解しました。 nuget 2.7以降からすべてが変更されており、「。nuget」フォルダーと関連するnuget.exeおよびnuget.targetを含める必要がなくなりました
ビルドプロセスを修正し、最新の推奨アプローチを使用するために、次のことを行いました。
-
<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へのすべてのプロジェクトおよびソリューション参照を削除して、自動パッケージ復元を利用できます。ここで説明するプロセスを多少自動化します。
スクリプトを実行するディレクトリを再帰的に処理し、どこかにある可能性のあるソリューションに対して実行します。注意して楽しんでください! (破損するものについては責任を負いません)
この件に関するいくつかの良いリンク:
同様の問題がありました。古い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>