Подтвердить что ты не робот

Построить на 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)
4b9b3361

Ответ 1

Сервер сборки TFS 2013 использует MSBuild 12.0, где CodeTasksFactory существует в Microsoft.Build.Tasks.v12.0.dll, а не Microsoft. Build.Tasks.v4.0.dll.

В идеале вы должны сделать следующее:

1) Откройте файл NuGet.targets: C:\Builds\1\xxxx\FTP-процессор (новый)\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" >
...

Ответ 3

После долгих исследований и попыток кучки "хаков" я продолжил понимать точную механику восстановления nuget. Оказывается, все изменилось с 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 script, который применяет вышеперечисленные рекурсии в любой папке:

Короче говоря, он отменяет "Включить восстановление пакета Nuget", что позволяет более новый метод восстановления пакета.

В Visual Studio 2013 автоматическое восстановление пакета стало частью IDE (и процесс сборки TFS). Этот метод более надежен, чем старше, встроенное восстановление пакета msbuild. Это не требует от вас nuget.exe проверяет каждое решение и не требует никаких дополнительные цели msbuild. Однако, если у вас есть файлы, связанные с старый метод восстановления пакета в вашем проекте, Visual Studio будет пропустить автоматическое восстановление пакета. (Такое поведение, вероятно, изменится скоро, надеюсь, это так).

Вы можете использовать этот script для удаления nuget.exe, nuget.targets и всех ссылки на проект и решение для nuget.targets, чтобы вы могли принять преимущество автоматического восстановления пакетов. Это более или менее автоматизирует описанный здесь.

Он перезапустится через каталог, в котором вы запускаете script, и выполняете это к любым решениям, которые могут быть где-то там. Будьте осторожны и повеселись! (не несет ответственности за все, что ломается)

Несколько хороших ссылок на эту тему:

Ответ 4

У меня была аналогичная проблема. Мы вынуждены использовать более старый msbuild, который поставляется с каркасом, а не версию v14, которая поставляется с visual studio 2015, потому что мы создаем старый код Delphi.net. Наши файлы 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>