2011-09-15 4 views
38

우리는 두 가지 해결책이 있습니다 foo.sln 및 bar.slnNuGet 및 여러 솔루션

나는 foo는 바 모두가 사용하는 공용 라이브러리를 가지고있다. Common.csproj는 둘 다 사용됩니다.

foo를 열고 nuget 참조를 업데이트하면 Common.csproj의 모든 참조는 foo/packages /를 가리 킵니다. 나중에 bar 및 update nuget 참조를 열면 모든 참조가 bar/packages /의 참조로 설정됩니다. 당연히, 이것은 foo 팀과의 격렬한 관계로, Common.csproj와 Foo 관련 데이터 사이의 비 호환성을 야기 할 수 있습니다. foo.Data.csproj는 foo/packages를 가리 킵니다.

"프로젝트 전체가 포함 된 거대한 솔루션을 만들고, 누젠을 만질 필요가 있다면 그 솔루션에서만 해보십시오."

issue on codeplex (부수적으로 가장 많이 쓴 이슈)이지만 분명히이 문제가 어떻게 해결되었는지 이해 하기엔 너무 두껍습니다. 누군가이 문제를 해결하는 방법을 설명 할 수 있습니까? 당신이 참조하고 솔루션의 그 자신의 것이 아니라 자신의 종속성이 별도의 조립으로 common.csproj하지 왜

+0

문제가 발생하지 않고 몇 달 동안 계속해서 문제가 발생했는지 갑자기 문제가 발생했는지, 어제 업데이트가 있었으며 갑자기 24 시간 내에 문제가 발생했는지 궁금합니다. 아니면 우연의 일치 일 수도 있습니다. – GraemeF

+5

http://stackoverflow.com/questions/6277925/nu-get-issue-with-project-level-dependences-for-projects-referenced-by-multipl/7908976#7908976을 ​​참조하십시오. 솔루션에서 파일을 저장할 위치를 지정하기 위해 구성을 변경하는 방법에 대해 설명합니다. 같은 솔루션 디렉토리에서 모든 솔루션을 가리키면 힌트 경로는 사용하는 솔루션에 관계없이 정확해야합니다. –

+1

@ReedRector를 사용하는 경우 댓글을 올리는 것만이 아니라 링크를 답으로 사용해야합니다. –

답변

1

.

참조 된 패키지를 업데이트 foo는 나 바 중 하나에서 일반 보호하는 것이 이렇게함으로써 그것을 깨기.

32

이 문제는 NuGet에 선행합니다. 두 가지 솔루션에서 참조 된 프로젝트가 있고 하나의 솔루션에서 열려있을 때 프로젝트에서 어셈블리 참조를 변경하는 경우 다른 솔루션에서 프로젝트가 열려있을 때 프로젝트의 참조 경로가 변경됩니다. 참조가 어떻게 변경되었는지에 관계없이 (NuGet 또는 다른 방식으로) 항상 그렇습니다.

그러나 실제로 문제는 업데이트를 수행 할 때 업데이트 된 패키지가 foo/packages 디렉토리에 나타나지 않는다는 것입니다.

간단한 솔루션은 Common.csproj를 자신의 참조, 패키지 폴더, 빌드 및 릴리스 프로세스와 함께 자체 솔루션으로 이동하는 것입니다. 그런 다음 관련 종속성이 포함 된 NuGet 패키지를 만듭니다. 그런 다음 Common 패키지를 Foo와 Bar에 모두 설치할 수 있으며, 그러면 Foo 팀은 Common 버전의 최신 버전으로 언제든지 업데이트 할 수 있습니다. 나는이에 대해 들었을

주요 인수는 디버깅하는 동안 공통 코드를 단계별로 할 수도 없다, 그러나 이것은 더 이상 비주얼 스튜디오의 문제입니다 2010 년

당신이 요청해야 근본적인 질문 누가 Common.csproj를 소유하고 있습니까? Foo 팀입니까, Bar 팀입니까?

+1

이것은 이것을 설명하는 가장 좋은 대답입니다. 이 투표를 열 번 할 수만 있다면 나는 – ferventcoder

+0

+1 그냥이 정확한 상황을 만났을 가능성이 높습니다 (잠시 동안 지연되었습니다)이 솔루션으로 이동합니다. – Sumo

+8

또한 NuGet 2.1이이 문제를 해결할 수 있음을 알았습니다. http://docs.nuget.org/docs/release-notes/nuget-2.1#Specify_%e2%80%98packages%e2%80%99_Folder_Location – Sumo

1

우리의 경우 많은 개발자들과 솔루션들이 다른 브랜치에있는 tfs와 여러 버전을 가지고 있습니다 ... 및 각 개발자는 소스가 어디에 있어야하는지에 대해 이해합니다.

이 경우 상대 경로는 작동하지 않으며, 일치 디스크의 경우 절대 경로는 상대 경로로 대체되며 작동하지 않습니다.

우리의 해결책은 상대 경로를 제거하는 것입니다. NuGetPackages를 별도의 디스크에 넣으면 작업을 수행 할 수 있습니다. 과 같이 :

net use /persistent:yes p: \\localhost\C$\NuGetPackagesDiskFolder 

당신이 그 후
못해 모든 폴더 이름, 당신은 스오 파일

PS 모두 삭제 한 후 NuGet.Config

<config> 
<add key="repositorypath" value="p:\NuGetPackages" /> 
</config> 
<packageRestore> 
<add key="enabled" value="True" /> 
</packageRestore> 

에 정말 절대 경로를 지정할 수 있습니다 : 그들이 sourcecontrol 에 사는 경우 exsisting 솔루션의 변경과 약간의 문제가 가장 쉬운 방법은 각 .csproj에서 p : \ NuGetPackages 경로를 수정하는 것이다 그렇지 않으면 모든 refs를 다시 설치하고 수동으로 소스 제어에서 삭제 된 것으로 표시된 모든 패키지를 취소해야합니다.

3

$ (SolutionDir) 변수를 포함하도록 프로젝트 파일의 힌트 경로를 변경하여 문제를 해결합니다.

Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
     <HintPath>$(SolutionDir)packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll</HintPath> 
관련 문제