2016-11-15 2 views
0

다른 패키지 Y에 따라 패키지 X가 있습니다. 기본적으로 (Visual Studio 2015 Upd3 + nuget 3.5) 패키지 X를 참조하는 프로젝트는 패키지 Y를 참조하여 업데이트됩니다. 문제는 X의 고객은 Y에 대한 참조가 전혀 필요 없다는 것입니다. Y 패키지의 API는 고객에게 노출되어서는 안되며 노출되어서는 안되기 때문입니다.비 transitive 패키지 종속성?

예상되는 동작은 다음과 같습니다. 패키지 X에 대한 참조를 추가 한 후 패키지 Y의 내용을 빌드시 출력 폴더에 복사해야하지만 패키지 Y를 프로젝트 참조에 추가해서는 안됩니다.

그렇게 할 방법이 있습니까?

이론적으로 우리는 프로젝트 X에 인프라 패키지 Y의 소스를 포함 할 수 있습니다 (두 프로젝트 모두 MIT 라이센스하에 opensource 임). 그러나 다소 표준적인 접근 방법을 선호합니다. 우리가 필요한 이유 경우

예 :

  • 우리가 지금 조사하고 사례 : 테스트 도우미와 nuget 패키지 PDB 파일은 소스 (참조 Microsoft.DiaSymReader 패키지)에 일치하는지 확인합니다. 모든 테스트 프로젝트에서 Microsoft.DiaSymReader 어셈블리를 참조하기를 원하지 않습니다.

  • 더 많거나 적게 이론적 인 것입니다 (현재 문제는 아니지만 프로젝트가 프로덕션으로 보내지면 문제가됩니다) : Roslyn을 사용하여 스크립트를 컴파일하고 실행하는 사용자 정의 스크립트 엔진. 우리는 스크립트 엔진을 사용할 모든 프로젝트에서 Roslyn 어셈블리에 대한 참조를 원하지 않습니다.

후자의 경우는 우리가 너무 분명, 우리의 프로젝트에 로슬린 소스를 병합 할 수 없습니다, 우리의 패키지의 일환으로 로슬린 바이너리를 배포 할 수 없습니다만큼 나쁘다.

모든 의견을 환영합니다!

답변

0

X 패키지를 작성한 사람이므로 nupkg 파일에 포함 된 것은 귀하에게 달려 있습니다. 타사 DLL도 포함시킬 수 있습니다.

기술적으로 가능하지만 그렇게하지 않는 것이 좋습니다. 어느 날 패키지 Y를 사용하기로 결정한 패키지 X의 소비자를 생각해보십시오. 갑자기 X가 Y의 다른 버전을 기대하기 때문에 런타임 오류가 발생합니다.

+0

예,이 옵션도 고려 중이지만 해석 할 수없는 종속성 충돌이 발생할 수 있습니다. 예 : YDK v1.0을 패키지 X의 일부로 제공하고 타사 프로젝트가 패키지 X를 참조한 다음 패키지 Y v2.0에 대한 명시 적 참조를 추가합니다. Roslyn과 같은 대규모 인프라 종속성은 분명히 없습니다. 따라서 우리는 일반적인 너겟 의존성을 유지하면서 고객의 프로젝트 참조에 포함시키지 않는 편을 선호합니다. – Sinix

0

패키지 Y의 dll을 패키지 X를 설치 한 프로젝트에 Y dll을 추가하지 않는 패키지 X.

다음 단계는 Y dll을 사용하여 패키지 X를 콘텐츠 파일로 만드는 방법을 보여줍니다.

  1. 패키지 X 프로젝트에 추가 -> 기존 항목으로 Y dll을 추가하십시오.
  2. 모든 Y DLL을 선택하고 마우스 오른쪽 단추로 속성 창을 열려면 "출력 디렉터리로 복사"를 "항상 복사"로 설정하십시오.
  3. 패키지 X.nupkg가 NuGet Package Explorer으로 파일을 열 때 이제 콘텐츠 폴더에 저장되어있는 Y DLL을 찾을 팩 프로젝트 X nuget.exe

와 패키지 X로. 그리고 다른 프로젝트에 패키지 X를 설치하면 Y dll이 프로젝트에 컨텐츠 파일로 추가됩니다. 프로젝트를 빌드 한 후 Y dll이 출력 디렉토리에 복사됩니다.

+0

이것은 # botond.botos가 제안한 것과 동일한 것입니다. 고객이 Y 패키지에 직접 참조를 추가하는 경우 버전 문제가 발생합니다. – Sinix

+0

고객이 X 패키지와 다른 버전을 가진 Y dll에 직접 참조를 추가하는 경우 응용 프로그램의 구성 파일에서 어셈블리 버전 리디렉션을 할 수 있습니다. https://msdn.microsoft.com/en-us/library/7wd6ex19(v= vs.110) .aspx # Anchor_2 –

+0

그래도 Nuget 통합 기능은 그러한 충돌에 대해 작동하지 않으므로 수동으로 해결해야했습니다. 패키지 Y가 거대한 경우 옵션이 아니라 예제로 roslyn입니다. – Sinix