2016-12-05 2 views
2

У меня есть проект ASP.NET MVC 5, который я пытаюсь создать на сервере нашей компании, используя MSBuild, однако сборка не восстанавливает пакеты NuGet. Я использую Visual Studio 2015 и TFS.NuGet Restore сбой с использованием MSBuild

Моя структура проект выглядит следующим образом:

  • Solution (.sln)
  • .nuget
    • NuGet.config
    • NuGet.targets
  • проекта Папка
    • элементы проекта (ссылки, библиотеки и т.д.)
  • Project.Test.Unit
    • испытания блока изделия

Вот мой NuGet.config файл:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <solution> 
    <add key="disableSourceControlIntegration" value="true" /> 
    </solution> 
</configuration> 

Вот мои NuGet.targets файл:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir> 

    <!-- Enable the restore command to run before builds --> 
    <RestorePackages Condition=" '$(RestorePackages)' == '' ">true</RestorePackages> 

    <!-- Property that enables building a package from a project --> 
    <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage> 

    <!-- Determines if package restore consent is required to restore packages --> 
    <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">false</RequireRestoreConsent> 

    <!-- Download NuGet.exe if it does not already exist --> 
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe> 
    </PropertyGroup> 

    <ItemGroup Condition=" '$(PackageSources)' == '' "> 
    <!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used --> 
    <!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list --> 
    <!-- 
      <PackageSource Include="https://www.nuget.org/api/v2/" /> 
      <PackageSource Include="https://my-nuget-source/nuget/" /> 
     --> 
    <PackageSource Include="\\itliv-nas03\Development Team\NuGet\Packages" /> 
    </ItemGroup> 

    <PropertyGroup Condition=" '$(OS)' == 'Windows_NT'"> 
    <!-- Windows specific commands --> 
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath> 
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(OS)' != 'Windows_NT'"> 
    <!-- We need to launch nuget.exe with the mono command if we're not on windows --> 
    <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath> 
    <PackagesConfig>packages.config</PackagesConfig> 
    </PropertyGroup> 

    <PropertyGroup> 
    <!-- NuGet command --> 
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">\\itliv-nas03\Development Team\NuGet\NuGet.exe</NuGetExePath> 
    <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources> 

    <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand> 
    <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand> 

    <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir> 

    <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch> 
    <NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch> 

    <PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir> 
    <PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir> 

    <!-- Commands --> 
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand> 
    <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand> 

    <!-- We need to ensure packages are restored prior to assembly resolve --> 
    <BuildDependsOn Condition="$(RestorePackages) == 'true'"> 
     RestorePackages; 
     $(BuildDependsOn); 
    </BuildDependsOn> 

    <!-- Make the build depend on restore packages --> 
    <BuildDependsOn Condition="$(BuildPackage) == 'true'"> 
     $(BuildDependsOn); 
     BuildPackage; 
    </BuildDependsOn> 
    </PropertyGroup> 

    <Target Name="CheckPrerequisites"> 
    <!-- Raise an error if we're unable to locate nuget.exe --> 
    <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" /> 
    <!-- 
     Take advantage of MsBuild's build dependency tracking to make sure that we only ever download nuget.exe once. 
     This effectively acts as a lock that makes sure that the download operation will only happen once and all 
     parallel builds will have to wait for it to complete. 
     --> 
    <MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" /> 
    </Target> 

    <Target Name="_DownloadNuGet"> 
    <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')" /> 
    </Target> 

    <Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites"> 
    <Exec Command="$(RestoreCommand)" 
      Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" /> 

    <Exec Command="$(RestoreCommand)" 
      LogStandardErrorAsError="true" 
      Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" /> 
    </Target> 

    <Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites"> 
    <Exec Command="$(BuildCommand)" 
      Condition=" '$(OS)' != 'Windows_NT' " /> 

    <Exec Command="$(BuildCommand)" 
      LogStandardErrorAsError="true" 
      Condition=" '$(OS)' == 'Windows_NT' " /> 
    </Target> 

    <UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <OutputFilename ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System.Core" /> 
     <Using Namespace="System" /> 
     <Using Namespace="System.IO" /> 
     <Using Namespace="System.Net" /> 
     <Using Namespace="Microsoft.Build.Framework" /> 
     <Using Namespace="Microsoft.Build.Utilities" /> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
       try { 
        OutputFilename = Path.GetFullPath(OutputFilename); 

        Log.LogMessage("Downloading latest version of NuGet.exe..."); 
        WebClient webClient = new WebClient(); 
        webClient.DownloadFile("https://www.nuget.org/nuget.exe", OutputFilename); 

        return true; 
       } 
       catch (Exception ex) { 
        Log.LogErrorFromException(ex); 
        return false; 
       } 
      ]]> 
     </Code> 
    </Task> 
    </UsingTask> 
</Project> 

Я попытался следующие:

Добавлен этот код в файл NuGet.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <solution> 
    <add key="disableSourceControlIntegration" value="true" /> 
    </solution> 
    <packageSources> 
    <add key="itliv" value="\\itliv-nas03\Development Team\NuGet\Packages" /> 
    </packageSources> 
    <activePackageSource> 
    <add key="All" value="\\itliv-nas03\Development Team\NuGet\Packages" /> 
    </activePackageSource> 
</configuration> 
  • Пробег через командную строку, используя:

nuget restore path\to\solution.sln который возвращает следующую ошибку:

WARNING: Unable to find version '3.4.1.9004' of package 'Antlr'. 
    C:\Users\it-chrism\.nuget\packages\: Package 'Antlr.3.4.1.9004' is not found on source 'C:\Users\it-chrism\.nuget\packages\'. 
    C:\Users\it-chrism\AppData\Local\NuGet\Cache: Package 'Antlr.3.4.1.9004' is not found on source 'C:\Users\it-chrism\AppData\Local\NuGet\Cache'. 
  • Я пытался редактировать мой NuGet.targets файл несколько различных способов в надежде исправить (пытавшиеся различные источники пакетов, различные случаи, удален/добавлены кавычки)

  • Я прочитал следующую документацию :: http://docs.nuget.org/ndocs/consume-packages/package-restore#migrating-to-automatic-restore, но не успех

  • Я обновил NuGet 3.3

Вот мой сообщение об ошибке при попытке построить:

Summary 
Release | Any CPU 
1 error(s), 0 warning(s) 
$/Develop/Websites/VehicleLookupUI/VehicleLookupWebUI.sln - 1 error(s), 0 warning(s), View Log File 
C:\Builds\1\Develop\VehicleLookupWeb-Develop\Sources\VehicleLookupUI\VehicleLookupWebUI\VehicleLookupWebUI.csproj (315): This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props. 
$/Develop/Websites/VehicleLookupUI/VehicleLookupWebUI.sln compiled 
No Test Results 
No Code Coverage Results 
Other Errors and Warnings 
2 error(s), 0 warning(s) 
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch. 

TF270015: 'MSBuild.exe' returned an unexpected exit code. Expected '0'; actual '1'. 

У меня есть ощущение, что NuGet смотрит в ту папку для недостающих пакетов. Я могу включить источники в «Инструменты»> «Диспетчер пакетов NuGet».> «Параметры диспетчера пакетов»> «Диспетчер пакетов NuGet»> «Источники пакетов», но это работает только для меня локально с помощью Visual Studio и не использует MSBuild, пытающегося создать его «из коробки».

Я пытаюсь построить на TSF, открыв Team Explorer> Сборки, затем правой кнопкой мыши на моей сборки и выбора очереди, New Build ...

+0

Возможный дубликат [NuGet автоматического восстановления пакетов не работает с MSBuild] (http://stackoverflow.com/questions/22300375/nuget-auto-package-restore-does-not-work-with-msbuild) –

+0

Если вы выходите в темноте в течение многих лет, вы должны знать, что теперь есть новый подход к восстановлению без MSBuild. –

+0

Просьба предоставить полную команду NuGet для восстановления пути \ to \ solution.sln, восстанавливает ли он это. –

ответ

0

Пожалуйста специальный Nuget.config файл на сервер TFS построить на следующий место. enter image description here

0

Вы используете MSBuild-интегрированный способ восстановить пакет, для этого пути, есть .nuget папка (содержит nugget.exe, nugget.config и nugget.targets) в растворе и должна быть добавлена ​​в системе управления версиями и вам не нужно добавлять шаг/задачу сборки Nuget Restore для определения сборки для восстановления пакета, поэтому удалите этот шаг/задачу и установите «Очистить» на «Истина» на вкладке «Репозиторий» вашего определения сборки. Я рекомендую вам перейти на автоматическое восстановление:

  1. Закройте Visual Studio, чтобы избежать файловых блокировок и конфликтов файлов.
  2. При использовании TFS: a. Удалите nuget.exe и nuget.targets из папки .nuget решения и удалите эти файлы из рабочей области решения. а. Сохраните файл nuget.config с параметром disableSourceControlIntegration, как описано в разделе «Опускание пакетов с Team Foundation Version Control».
  3. Если не используется TFS: a. Удалите папку .nuget из решения и рабочей области решения.
  4. Редактировать каждый файл проекта в решении, удалить элемент <RestorePackages> и удалить любые ссылки на файл nuget.targets.

Дополнительная информация, вы можете обратиться к статье this.