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

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

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

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



답변

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


답변

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

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


답변

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

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를 시작하고 솔루션을 열고 다시 빌드합니다.

답변

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 패키지 관리’창을 다시 빌드하거나 열면 표시되지 않을 수 있으며 표시되기 시작합니다).


답변

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 프로젝트에서 작동 함).


답변

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