NuGet 자동 패키지 복원이 MSBuild에서 작동하지 않음


111

MSBuild 12.0을 사용 하여 packages콘텐츠가 누락 된 ( repositories.config내부 제외 ) 솔루션을 구축하려고합니다 . 빌드하기 전에 누락 된 모든 패키지를 자동 복원 할 것으로 예상하지만 이것은 사실이 아닙니다. MsBuild는 수많은 오류를보고합니다.

"사용 지시문이나 어셈블리 참조가 누락 되었습니까?"

NuGet Manager는 2.7입니다 (박스에 대한 Visual Studio 2013에서 볼 수 있음). 나는 심지어 EnableNuGetPackageRestore=true매개 변수 를 전달하려고 시도했습니다 -운이 없습니다. 내가 무엇을 놓치고 있습니까?


Visual Studio 내에서 솔루션을 구축하고 있습니까? 또한 패키지 복원 섹션의 패키지 관리자 설정에서 모든 항목이 선택되어 있습니까? Visual Studio 내에서 빌드하고 NuGet 2.7 이상을 사용하는 경우 .nuget 폴더가 필요하지 않습니다.
Matt Ward

1
아니요, 명령 줄에서 최신 MsBuild ( msdn.microsoft.com/en-us/library/hh162058.aspx ) 버전을 사용하고 있습니다. VS 내에서 Nuget을 2.8로 업데이트했습니다. 운이 없습니다.
UserControl

3
MSBuild만으로는 복원되지 않으며 VS 추가 기능도 있습니다. @KMoraz가 말한대로 패키지 복원을 활성화해야합니다. 그러면 Sumeshk가 말했듯이 .nuget 폴더가 나타나고 패키지를 복원 할 수 있습니다. 소스 제어에 .nuget을 확인하십시오.
Lex Li

답변:


36

v3.3.0부터 최신 공식 NuGet 문서로 업데이트 됨

패키지 복원 접근 방식

NuGet은 패키지 복원 사용에 대한 세 가지 접근 방식을 제공합니다 .


자동 패키지 복원 은 Visual Studio 내의 패키지 복원 에 대한 NuGet 팀의 권장 접근 방식이며 NuGet 2.7에 도입되었습니다. NuGet 2.7부터 NuGet Visual Studio 확장은 Visual Studio의 빌드 이벤트에 통합되고 빌드가 시작될 때 누락 된 패키지를 복원합니다. 이 기능은 기본적으로 활성화되어 있지만 개발자는 원하는 경우 옵트 아웃 할 수 있습니다.


작동 방식은 다음과 같습니다.

  1. 프로젝트 또는 솔루션 빌드에서 Visual Studio는 솔루션 내에서 빌드가 시작된다는 이벤트를 발생시킵니다.
  2. NuGet은이 이벤트에 응답하고 솔루션에 포함 된 packages.config 파일을 확인합니다.
  3. 찾은 각 packages.config 파일에 대해 패키지가 열거되고 Checked for가 솔루션의 패키지 폴더에 있습니다.
  4. 누락 된 패키지는 패키지 소스의 순서에 따라 사용자의 구성 (및 활성화 된) 패키지 소스에서 다운로드됩니다.
  5. 패키지가 다운로드되면 솔루션의 패키지 폴더에 압축이 풀립니다.

Nuget 2.7 이상이 설치되어있는 경우; Visual Studio에서 자동 패키지 복원 관리를위한 한 가지 방법을 선택하는 것이 중요합니다.

두 가지 방법을 사용할 수 있습니다.

  1. (Nuget 2.7 이상) : Visual Studio-> 도구-> 패키지 관리자-> 패키지 관리자 설정-> 자동 패키지 복원 활성화
  2. (Nuget 2.6 이하) 솔루션을 마우스 오른쪽 버튼으로 클릭하고 "이 솔루션에 대한 패키지 복원 활성화"를 클릭합니다.


명령 줄 에서 솔루션을 빌드 할 때 명령 줄 패키지 복원 이 필요합니다. NuGet의 초기 버전에서 도입되었지만 NuGet 2.7에서는 개선되었습니다.

nuget.exe restore contoso.sln

MSBuild 통합 패키지 복원 접근 방식은 원래의 패키지 복원 구현이며 많은 시나리오에서 계속 작동하지만 다른 두 접근 방식으로 해결되는 전체 시나리오 세트를 다루지는 않습니다.


63
이것은 더 이상 nuget에서 권장하지 않습니다. 문서를 참조하십시오. docs.nuget.org/docs/workflows/…
Owen Johnson

@OwenJohnson, 그 문서는 내가 볼 수있는 날짜가 아니며 지금 권장하지 않는다고 어떻게 말하는지 모르겠습니다. 나는 VS2013에 있고 그 버튼이 잘 작동하는 것 같습니다. "그래서"Nuget 패키지 복원 활성화 "를 클릭했는데 이제 항목이 빌드되지 않습니다. 문제를 해결하는 단계는 고통 스럽지만이 스크립트를 사용하면 덜 고통 스럽습니다." github.com/owen2/ AutomaticPackageRestoreMigrationScript 아마도 이것을 더 설명하는 다른 문서가있을 것입니다.
AnneTheAgile 2014

5
자동 패키지 복원은 ms-build 통합 복원을 대체합니다. 이 문서는 업그레이드 방법에 대한 지침입니다. msbuild-integrated 메서드에 문제가없는 경우 아무것도 수행 할 필요가 없습니다. 가장 간단한 경우에는 작동하지만 CI 서버, 공유 프로젝트 참조 또는 기타 조건이있는 경우 불쾌한 지뢰를 밟고 잘못된 힌트 경로 또는 기타 문제가 발생할 수 있습니다.
Owen Johnson

1
이 답변과 docs.nuget.org/consume/package-restore/… 에서 "이전 작업 수행"지침을 수행하여 성공을 찾을 수있었습니다.
granadaCoder

NuGet 4 및 .net 표준으로 상황이 다시 변경된 것 같습니다.
Owen Johnson

239

MSBuild 15 이상과 함께 제공되는 Visual Studio 2017 이상을 사용 하고 .csproj 파일이 PackageReference형식 인 경우 가장 간단한 방법은 새 MSBuild Restore대상 .


아무도 실제로 "MSBuild를 사용하여 명령 줄에서 빌드 할 때 NuGet 패키지를 자동으로 복원하려면 어떻게해야합니까?"라는 원래 질문에 대답하지 않았습니다. 대답은 다음과 같습니다. "NuGet 패키지 복원 활성화"옵션 (현재이 참조에 따라 더 이상 사용되지 않음)을 사용 하지 않는 한 사용할 수 없습니다 (아래 참조). 예를 들어 CI 서버에서 자동화 된 빌드를하려는 경우 이건 짜증납니다.

그러나 원하는 동작을 얻을 수있는 약간의 우회 방법이 있습니다.

  1. https://dist.nuget.org/win-x86-commandline/latest/nuget.exe 에서 최신 NuGet 실행 파일을 다운로드 하여 PATH에 배치합니다. (이 작업은 사전 빌드 단계로 수행 할 수 있습니다.)
  2. nuget restore누락 된 모든 패키지를 자동 다운로드하는 실행 합니다.
  3. msbuild솔루션을 빌드하려면 실행하십시오 .

참고 : 자동 패키지 복원을 수행하는 새롭고 권장되는 방법은 버전 제어가 덜 복잡하지만 다운로드 및 실행이라는 추가 과정을 거치지 않는 한 명령 줄 패키지 복원을 불가능하게 만듭니다 nuget.exe. 진행?


유사한 솔루션으로 끝났습니다 (그러나 nuget.exe/ trunk / ext에 배치됨 ). 한 단계 앞으로-두 단계 뒤로 :(
UserControl

40
이것은 표시된 답변이 아니라 올바른 답변이어야합니다.
Woland

이것은 실제로는 약간 직관적이지 않은 것처럼 보이지만 명령 줄을 사용하여 특정 너겟 패키지를 다시 추가 할 수있는 더 많은 기능을 얻을 수 있습니다. 이 솔루션은 자동 복원이 실패하는 동안 저에게 효과적이었습니다.
TGarrett

2
Jenkins를 사용하고 있었는데이 작업을 수행해야했는데 msbuild를 호출하기 전에 간단한 빌드 단계였습니다. Windows 배치 파일은 빌드 단계 유형이었고 : cmd.exe / c "C : \ Program Files \ nuget \ nuget.exe"restore < RelativePathToSln> .sln-sln 파일을 찾지 못한 경우를 대비하여 습관 / 절차로 SLN 경로를 수행했습니다.
스티브 Radich-BitShop.com

1
이 접근 방식은 Jenkins 빌드에서 복원을 설정할 때 효과적이었습니다. 나에게 중요한 한 가지 핵심은 NuGet.Config 내 .SLN 파일과 동일한 디렉터리에 있어야한다는 것입니다. 명령 줄에서 -ConfigFile을 지정하는 것을 포함하여 다른 구성 파일 위치의 조합은 작동하지 않습니다.
Guerry 2015

56

Nuget의 자동 패키지 복원은 MSBuild가 아닌 Visual Studio (2013 년부터 시작)의 기능입니다. nuget.exe restore명령 줄에서 패키지를 복원 하려면 실행 해야합니다.

Enable Nuget Package Restore 기능을 사용할 수도 있지만, 프로젝트 파일을 방해하는 방식으로 변경하고 다른 솔루션에서 해당 프로젝트를 빌드하는 경우 문제가 발생할 수 있으므로 더 이상 nuget 사용자가 권장하지 않습니다.


2
NuGet 버전이 2.7 이상이 아닌 경우 restore-command를 사용하기 전에 "nuget update -self"를 실행해야합니다. 내 NuGet은 버전 2.1이었고 업데이트하기 전에 "복원"명령을 인식하지 못했습니다.
Teknikaali

2
"다른 솔루션에서 해당 프로젝트를 빌드하면 문제가 발생합니다."아직 문제가 발생하지 않았으며 각각 수십 개의 프로젝트가있는 3 개의 솔루션이 있습니다 (많은 솔루션이 여러 솔루션에서 공유 됨). 운이 좋을까요?
Nelson Rothermel

@NelsonRothermel이 발생할 수있는 가장 주목할만한 문제 상황은 솔루션을 빌드 할 때 사용할 수없는 외부 솔루션의 패키지 폴더에 대해 nuget-delivered dll을 참조하는 프로젝트입니다.
Owen Johnson

2
@OwenJohnson 모든 솔루션에 대해 하나의 공통 패키지 폴더가 있으므로 문제가 발생하지 않은 것 같습니다.
Nelson Rothermel

17

전체 사진을 파악하는 데 약간의 시간이 걸렸고 여기서 공유하고 싶습니다.

Visual Studio에는 패키지 복원을 사용하는 두 가지 방법, 즉 자동 패키지 복원과 MSBuild 통합 패키지 복원이 있습니다. 'MSBuild-Integrated Package Restore'는 일부 시나리오에서 문제를 일으킬 수있는 빌드 프로세스 중에 패키지를 복원합니다. NuGet 팀 에서 권장하는 방법 은 '자동 패키지 복원'입니다 .

'자동 패키지 복원'이 작동하도록하려면 몇 가지 단계가 있습니다.

  1. Visual Studio, 도구-> 확장 및 업데이트에서 최신 버전 (버전 2.7 이상)이있는 경우 NuGet을 업그레이드합니다.

  2. TFS를 사용하는 경우 솔루션의 .nuget 폴더에서 NuGet.exe 및 NuGet.targes 파일을 제거합니다. 그런 다음 NuGet 패키지를 체크인하지 않도록 NuGet.Config를 편집합니다.

    <configuration>  
      <solution>  
        <add key="disableSourceControlIntegration" value="true" />  
      </solution>  
    </configuration> 

    이전에 솔루션의 패키지 폴더를 TFS에 체크인 한 경우 폴더를 삭제하고 패키지 폴더 삭제 삭제를 체크인하십시오.

    TFS를 사용하지 않는 경우 .nuget 폴더를 삭제하십시오.

  3. 솔루션의 각 프로젝트 파일 (.csproj 또는 .vbproj)에서 NuGet.targets 파일을 참조하는 줄을 제거합니다. 참조는 다음과 같습니다.

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

    솔루션의 모든 프로젝트 파일에서이 줄을 제거하십시오.

  4. Visual Studio 메뉴에서

    도구-> 옵션-> 패키지 관리자-> 일반 또는 도구-> NuGet 패키지 관리자-> 패키지 관리자 설정

    다음 두 가지 옵션을 활성화하십시오. 1) '누락 된 패키지 다운로드 허용'2) 'Visual Studio에서 빌드하는 동안 누락 된 패키지 자동 확인'

  5. 다음 단계에 따라 패키지 복원 구성을 테스트하십시오.

    • 솔루션을 저장하고 Visual Studio를 닫습니다.
    • 솔루션의 패키지 폴더 삭제
    • Visual Studio를 시작하고 솔루션을 열고 다시 빌드합니다.

1
단계 중 하나는 <Import Project = "$ (MSBuildToolsPath) \ Microsoft.CSharp.targets"/>를 제거하는 것입니다. 왜 그렇게 하시겠습니까?
사예드 이브라힘 하시

3
템플릿 자체에있는 것이 착각이라고 생각합니다. 그것 없이는 소스 파일이 전혀 빌드되지 않습니다.
Sayed Ibrahim Hashimi 2014 년

3
나는 그가 Microsoft.CSharp.targets 대신 nuget.targets를 의미한다고 생각합니다.
Owen Johnson

2
docs.nuget.org/docs/workflows/… <-다음은 Ying이 말하려고했던 공식 문서입니다.
Owen Johnson

1
Ying이 맞습니다 ... 모든 사람이 무시한 것은 Continuous Integration 빌드가 사전 빌드 이벤트 후 자체 임시 작업 영역을 만들고 소스를 가져온 다음 NuGet 참조를 차단한다는 사실입니다. 이것은 TFS 빌드 자동화를위한 수정입니다.
CZahrobsky

5

MSBuild 15에는이를 수행하는 / t : restore 옵션 이 있습니다. Visual Studio 2017과 함께 제공됩니다.

이것을 사용하려면 새로운 PackageReference 를 사용해야합니다. 즉, packages.config파일을 다음과 같은 요소로 대체해야 합니다 (* .csproj에서 수행).

<ItemGroup>
  <!-- ... -->
  <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
  <!-- ... -->
</ItemGroup>

'참조'를 마우스 오른쪽 버튼으로 클릭하면이 형식으로 자동 마이그레이션됩니다 (Visual Studio를 방금 열거 나 '솔루션 용 NuGet 패키지 관리'창을 다시 빌드하거나 열면 표시되지 않을 수 있으며 표시되기 시작합니다).


msbuild의 복원 옵션은 nuget 복원과 미묘한 차이가 있음을 고려해야합니다 . 예를 들어 github.com/NuGet/Home/issues/7651#issuecomment-500842049 를 참조 하세요 .
Matthieu 19

4

Ian Kemp가 답을 가지고 있습니다. (몇 가지 포인트가 있습니다.) 이것은 단순히 그의 단계 중 하나에 약간의 고기를 추가하는 것입니다.

내가 여기서 끝낸 이유는 dev의 머신이 잘 빌드되고 있었지만 빌드 서버는 단순히 필요한 패키지 (빈 패키지 폴더)를 가져 오지 않았기 때문에 빌드가 실패했습니다. 그러나 빌드 서버에 로그온하고 솔루션을 수동으로 빌드하는 것은 작동했습니다.

Ians 3 단계 중 두 번째 단계 ( nuget restore 실행 )를 수행하려면 아래와 같이 exec 명령을 실행하는 MSBuild 대상을 만들어 nuget restore 명령을 실행할 수 있습니다 (이 경우 nuget.exe는 .nuget 폴더에 있습니다. 경로에 있음), 솔루션을 빌드하기 직전에 TeamCity 빌드 단계 (사용 가능한 다른 CI ...)에서 실행할 수 있습니다.

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

기록을 위해 이미 "nuget installer"실행기 유형을 시도했지만이 단계는 웹 프로젝트에 매달려있었습니다 (DLL 및 Windows 프로젝트에서 작동 함).


1
새로운 코드 세트 (CI)에서 지속적으로 빌드하는 경우 이것이 갈 길입니다.
Jahmic 2016-06-12

1
각 솔루션 / 프로젝트가 생성 된 너겟 버전에 의존한다는 것을 보장하기 때문에이 접근 방식이 좋습니다. 조만간 이전 버전의 너겟을 사용하여 만든 오래된 프로젝트가있는 회사에서 일하는 경우이 기능이 중요 할 수 있습니다. 개발자는 각 프로젝트가 고유 한 nuget.exe "로컬 풍미"를 가지고 있기 때문에 시스템 전체의 nuget.exe가 문제를 일으킬 지 여부에 대해 걱정할 필요없이 이러한 프로젝트를 유지할 수 있습니다. 마지막 팁으로 nuget 3.x +를 사용하면 다음과 같은 패키지를 복원 할 수 있습니다. nuget.exe restore packages.config -PackagesDirectory path \ to \ packages
XDS

1
이 방법의 문제점은 복원 단계를 추가하기 위해 후속 프로젝트 파일을 편집해야한다는 것입니다. TFS2012에서 "InvokeProcess"활동을 추가하거나 TFS2013 빌드 템플릿에서 "NuGetRestore"활동을 추가하여이 단계가 빌드 서버에서 실행되도록 할 수 있습니다. InvokeProcess의 경우 2012 년에 "SourcesDirectory"특성을 전달합니다. TFS 2013에서는 필요에 따라 값만 입력하면됩니다. 이를 수행하는 방법에 대한 많은 블로그가 있습니다.
Neville

3

당신이 사용하는 경우하는 것으로 인 TeamCity를 빌드 서버로, 당신은 당신이 빌드 단계 이전에 모든 패키지를 복원하는 데 사용할 수있는 "NuGet 설치"단계를 얻을.


2

프로젝트 가 포함 된 packages.config 파일이 있으며 여기에는 패키지 세부 정보가 포함되어 있습니다.

또한 NuGet.exe 및 NuGet.targets 가 포함 된 .nuget 폴더가 있습니다 . 파일 중 하나라도 누락 된 경우 누락 된 패키지를 복원하지 않고 "using 지시문 또는 어셈블리 참조가 누락 되었습니까?" 오류


2
.nuget폴더 가없고 없었습니다. packages.config프로젝트 폴더 내의 모든 파일이 제자리에 있습니다.
UserControl

NuGet.exe 및 NuGet.targets가 앱을 빌드하는 동안 누락 된 모든 패키지를 자동으로 복원하고 NuGet.exe 및 NuGet.targets 파일을 잃어 버렸습니다. 즉 오류가 발생합니다
Sumeshk

어쨌든 감사합니다-나는 어떤 도움을 주셔서 감사합니다!
UserControl

.nuget 폴더는 Visual Studio에서 생성 된 폴더로, 자동 패키지 복원을 활성화 한 경우에만 나타납니다. nuget.config와 같이 빌드에서 참조 할 수 있으므로 코드 리포지토리에 nuget.exe를 포함하는 것이 유용합니다 (특히 여러 리포지토리에서 패키지를 가져와야하는 경우).
MytyMyky

2

복원하려는 패키지의 폴더가 "packages"폴더 (예 : "Packages / EntityFramework.6.0.0 /" )에 있지만 "DLL"이 내부에 없을 때 (대부분의 버전 관리 시스템은 ".dll"파일을 자동으로 무시합니다.) 이는 NuGet이 각 패키지를 복원하기 전에 폴더가 이미 있는지 확인하기 때문에 발생합니다. 따라서 폴더가 있으면 NuGet은 "dll"이 그 안에 있다고 가정합니다. 따라서 이것이 문제인 경우 NuGet이 올바르게 복원 할 폴더를 삭제하면됩니다.


1
VS 2015 및 TFS의 경우이 문제가 해결됩니다. 문제는 해결되지 않은 참조이며, 종종 문제는 패키지의 폴더가 이미 패키지 폴더에 있지만 패키지가 제대로 확장되지 않았기 때문에 너겟 패키지가 복원되지 않는 것입니다. (예 : .dll을 포함해야하는 lib 폴더가 누락되었습니다.) 패키지 내 패키지의 전체 폴더를 삭제 한 다음 솔루션 수준에서 마우스 오른쪽 버튼을 클릭하고 패키지 복원을 선택하십시오.
Greg

1

devenv.exe를 사용하여 sln 파일을 빌드하는 스크립팅 된 야간 빌드에 포함되지 않은 nuget 패키지에 문제가 있습니다.

Microsoft조언을 따랐고 핵심 단계는 NuGet 구성을 업데이트하여 %AppData%/NuGet다음을 포함하도록하는 것이 었습니다.

<configuration>
    <packageRestore>
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>

그래서 Visual Studio에서 설정을 변경하면 (대부분의 답변이 여기에 있음) 위의 내용이 실제로 변경된다는 것을 확인했습니다. 다른 "키"는 <add key = "enabled"value = "False"/>입니다.
granadaCoder

0

Visual Studio 2017에서-IDE를 사용하여 컴파일 할 때-누락 된 모든 nuget 패키지를 다운로드하고 "packages"폴더에 저장합니다.

그러나 빌드 머신에서 컴파일은 msbuild.exe를 사용하여 수행되었습니다. 이 경우 nuget.exe를 다운로드하여 경로에 보관했습니다.

msbuild.exe를 실행하기 전에 각 빌드 프로세스 동안. -> nuget.exe restore NAME_OF_SLN_File을 실행합니다 (.SLN 파일이 하나만있는 경우 해당 매개 변수를 무시할 수 있음)


0

당신은 또한 사용할 수 있습니다

Update-Package -reinstall

Visual Studio의 패키지 관리 콘솔에서 NuGet 패키지를 복원합니다.


이 질문에 대한 답변이 아닙니다
TS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.