참조 된 종속성을 포함하여 NuGet 패키지 자동 빌드


83

로컬 / 내부 NuGet 리포지토리실행하고 싶습니다 . NuGet을 사용하여 더미 프로젝트에 기존 NuGet 패키지를 포함하고 패키지 파일을 스캔하여 로컬에서 캐시 된 .nupkg파일 을 가져옴으로써 기존 NuGet 패키지를 "재사용"하는 방법을 알아 냈다고 생각 하지만 ...

NuGet을 통해 .nupkg가져온 종속성뿐만 아니라 모든 dll 종속성을 자동으로 포함하여 프로젝트에서 nuget 패키지 ( )를 어떻게 생성 합니까?

구체적으로 특별히:

  1. 솔루션 만들기
  2. 새 프로젝트 추가
  3. 다양한 .dll파일 / 기타 프로젝트에 대한 참조 추가 <-이것은 누락 된 부분입니다.
  4. 패키지 관리자 / cmdline / 무엇이든을 통해 NuGet 패키지 추가
  5. 뭔가 자동으로 생성.nupkg

내가 찾은 것에서 당신은

  • 종속성을 포함하도록 .csproj파일을 수동으로 편집하십시오.<BuildPackage>true</BuildPackage>
  • 수동으로 .nuspec파일을 만들고 종속성을 수동으로 나열합니다 ( 유사? ).
  • 파일 nuget pack에서 수동으로 실행.nuspec

그러나 모든 것이 수동이며 어리 석습니다. 반자동 솔루션조차도 여전히 어색하거나 반 수동입니다.

.nuspec프로젝트 참조에서 매니페스트 를 자동으로 생성하는 것에 만족할 것입니다 . 그런 다음 이론적으로 + 너겟 빌드 이벤트를 빌드 프로젝트 / 너겟 패키지로 롤업 할 수 있습니다. 이것이 제가 정말로보고 싶은 것입니다.


난 그냥이 VS 확장을 가로 질러왔다 eyecatch.no/projects/nuget-package-template ... 내가 들여다해야합니다
drzaus

3
5 년이 지난 후에도 Nuget 4.x 사양 또는 팩은 여전히 ​​종속성을 확인할 수 없습니다.
StingyJack

이 문제에 대한 업데이트가 있습니까? 아니면 여전히 이러한 문제가 있습니까?
Dominic Jonas

나는 얼마 전에 이것을 포기하지만,보고에 NuProj 체크 아웃 이 답변
drzaus

이 문제는 여전히 존재합니다. :(
BrainSlugs83

답변:


75

포인트 # 3 ( 다양한 .dll 파일 / 다른 프로젝트에 대한 참조 추가 <-이것은 누락 된 부분 )에는 실제로 두 가지 다른 문제가 있습니다. (1) 다양한 dll 파일에 대한 참조를 추가하고 (2) 다른 프로젝트에 대한 참조를 추가합니다. 동일한 솔루션.

여기 번호 (2)는 NuGet 2.5부터 일부 추가 지원을 받았습니다 . 프로젝트에 대한 NuGet 패키지를 만들 때 동일한 솔루션의 다른 프로젝트에 대한 참조를 포함하는 옵션을 추가 할 수 있습니다.

nuget pack projectfile.csproj -IncludeReferencedProjects

projectfile.csprojNuGet 패키지로도 노출되는 솔루션의 다른 프로젝트를 참조하는 경우 이러한 프로젝트의 NuGet 패키지가 종속성으로 추가됩니다. NuGet 패키지로 자신을 노출 하지 않는 솔루션의 프로젝트를 참조하는 경우 해당 dll이이 NuGet 패키지에 포함됩니다.

(1)의 경우 NuGet 패키지로 사용할 수없는 dll을 프로젝트에 자주 추가하는 경우 이러한 파일로 고유 한 (내부) NuGet 패키지를 만들 수 있습니다. 그런 다음 이러한 dll을 파일 대신 NuGet 패키지로 추가하면이 NuGet 패키지는 프로젝트의 NuGet 패키지에서 종속성이됩니다.


3
한숨 # 1은 여전히 ​​내 취향에 비해 너무 수동적입니다. 실제로 "이 파일을 사용하여 고유 한 (내부) NuGet 패키지 만들기"는 제가하려는 작업입니다.이 질문의 요점은 비 NuGet .dll을 NuGet 패키지로 자동 롤업하려는 것입니다. 에서 수동으로 각 dll을 나열하지 마십시오 .nuspec.
drzaus 2013 년

각 DLL을 별도로 지정할 필요가 없습니다. 당신이 그들 중 많은 것을 가지고 있다면 그것은 실제로 많은 일이 될 것입니다. 포함 할 파일을 나열 할 때 (재귀 적) 와일드 카드 ( docs.nuget.org/docs/reference/… )를 사용할 수 있으므로 예를 들어 이러한 모든 DLL을 별도의 폴더에 배치하면 포함하는 것이 한 줄로 됩니다. 그들 모두.
Julian

아, 이제 어디로 갈지 알 수 있습니다. 래퍼 프로젝트를 만들면 일반적인 "마우스 오른쪽 버튼 클릭 프로젝트> 참조 추가"를 통해 참조를 nuspec포함하면 bin디렉토리 에있는 모든 것을 포함하는를 만들 수 있습니다 (내 참조가 모두 "로컬 복사"), 내가 추가 한 항목을 자동으로 선택합니다. 약간 불편한 것 같지만 아마도 작동 할 것입니다.
drzaus 2013 년

6
bin 디렉토리에있는 내용을 자동으로 선택하지 않습니다. 다음과 같이 명시 적으로 지정해야합니다.<file src="bin\release\*.dll" target="lib" />
Julian

2
참조되는 프로젝트는 다음 nuspec 파일이 일어날 경우, nuget 가치 패키지로 그 치료와 LIB 폴더에 포함되지하지만, 패키지 의존성에 추가 할 것 참고
workabyte

5

다른 Google 직원의 경우 NuGet.targets 파일을 사용하여 NuGet Pack을 실행하는 경우 다음을 사용할 수 있습니다.

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

7
유망하지만 실제로 구현하기에 충분한 정보가 아닙니다. 이 NuGet.targets 파일은 무엇입니까? 일반적으로 빌드 대상 파일에 익숙하지만 특정 사용 사례는
아님

2

이것 좀 봐!

내가 찾은 솔루션은 Visual Studio의 확장입니다 : https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Nuget Package NuGet Package 라는 새 프로젝트를 추가하기 만하면됩니다.

그런 다음 흥미로운 프로젝트를 참조 및 BOOOM에 추가합니다! 모든 종속성 및 파일 디렉토리가 자동으로 추가됩니다. NuSpec 데이터를 수정하려면 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 속성으로 이동 한 다음 원하는 항목을 수정합니다. 생성 된 NuSpec 및 nupkg는 새 프로젝트의 obj 폴더 에 있습니다. 나는 그것이 도움이되기를 바랍니다;).


1
VS2017에 대한 솔루션도 있습니까?
Dominic Jonas

빌드 서버에서 패키지를 생성하는 경우에는 작동하지 않습니다.
Michi-2142

안타깝지만 더 이상 사용되지 않습니다. 유용했을 것입니다.
joelc

2

이 주제에 대해 잘 작성된 기사를 찾았습니다. 종속성 계층 구조가있는 특정 패키지에 대해 동일한 문제가 있으며 지금까지 각각을 별도의 NuGet 패키지로 업로드했습니다 (무슨 시간 낭비)

방금 여기에서 찾은 솔루션을 테스트했습니다. https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

그리고 NuGet 패키지 탐색기를 사용하여 NuGet 패키지를 검사 한 후 참조 된 프로젝트에서 생성 된 DLL이 실제로 존재합니다. 이 패키지를 실제로 NuGet에 제출하고 테스트하여 테스트하겠습니다.

도움이되는 경우를 대비 한 내 소스는 다음과 같습니다. https://github.com/jchristn/NuGetPackTest

그리고 테스트 NuGet 패키지 : https://www.nuget.org/packages/NuGetPackTest/1.0.0

솔루션이 잘 작동하는 것 같습니다. 참조 레이어가있을 때 어떤 모습 일지 모르겠습니다. 정말 털이 많고 빨라질 수 있다고 확신합니다.

여기에 이미지 설명 입력

프로젝트 TestLibrary를 참조하는 NuGetPackTest 라이브러리의 .csproj (간결성을 위해 일부 제거됨)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

1
이것은 내 문제를 즉시 해결했습니다. 나는 링크에 언급 된 지침을 따랐고 작동했습니다. 답변에 요점을 추가해 주셔서 감사합니다.
Jabez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.