2014-04-30 2 views
6

우리의 nupkg 패키지에는 동일한 dll (x86, x64, AnyCPU)의 여러 버전이 포함되어 있으며 csproj 파일에는 참조에서 현재 플랫폼 세트에 따라 특정 dll을 선택하는 조건부 참조가 사용됩니다. 결과적으로 동일한 라이브러리 (여러 플랫폼 컴파일)에 대한 여러 참조가 있습니다.NuGet 업데이트 및 조건부 참조

여기 내 csproj 파일의 조각입니다 :

<Reference Include="xxxx" Condition="'$(Platform)'=='x86'">    
    <HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x86\xxxx.dll</HintPath> 
</Reference> 
<Reference Include="xxxx" Condition="'$(Platform)'=='x64'"> 
    <HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x64\xxxx.dll</HintPath> 
</Reference> 
<Reference Include="xxxx" Condition="'$(Platform)'=='AnyCPU'"> 
    <HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\AnyCPU\xxxx.dll</HintPath> 
</Reference> 

이 구조는 모두의 MSBuild에서 및 Visual Studio에서 매우 잘 작동합니다.

불행히도 너겟 업데이트 이후에 csproj 참조가 엉망이됩니다. 다음은 결과입니다 : 하나의 참조가 업데이트되고있어 같은

<Reference Include="xxxx" Condition="'$(Platform)'=='x86'"> 
    <HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x86\xxxx.dll</HintPath> 
</Reference> 
<Reference Include="xxxx" Condition="'$(Platform)'=='x64'"> 
    <HintPath>..\..\packages\xxxx.2.7.0.1093\lib\net45\x64\xxxx.dll</HintPath> 
</Reference> 
<Reference Include="xxxx"> 
    <HintPath>..\..\packages\xxxx.2.7.0.1094\lib\net45\x86\xxxx.dll</HintPath> 
</Reference> 

그래서 보이는 ... 조건 섹션뿐만 아니라 목록의 첫 번째 DLL을 사용 하였다 하락되었다.

내가 기대했던 것이 아닙니다. 그 문제를 해결하는 가장 좋은 방법은? 당신의 csproj와 nuget의 조건부 참조를 사용하는 사람은 누구입니까? 모든 조언을 크게 주시면 감사하겠습니다!

+0

Nuget은 .csproj 참조를 부두합니다. 위의 내용은 솔루션 레벨에서 nuget 패키지를 원한다는 또 다른 이유입니다 ... 그리고 버전이없는 것입니다. 빌드 번호 범위를 사용하여 버전 관리를 제어하도록하겠습니다. 나는 java/ivy world에서 왔는데, 이는 솔루션 레벨에서 바이너리 의존성을 처리 할 수 ​​있도록 해준다. 나는 당신이 해결책을 찾을 것이라고 생각하지 않지만 희망을 갖고 나는 틀렸고 누군가는 안으로 들어올 것입니다. – granadaCoder

+0

고마워, 네 말이 맞아. 우리가 취하고있는 접근법은 csproj 파일을 스스로 업데이트하는 것이다. MSBuild "nuget-update"타겟의 일부. 누군가가 더 나은 방법을 알기를 바랬습니다./ 솔루션 레벨 종속성은 특히 하나의 응용 프로그램에서 동일한 DLL의 두 가지 다른 버전을 참조하는 것이 좋지 않은 상황에서 의미가 있습니다. 프로젝트 레벨 종속성을 사용하면 매우 쉽게 수행 할 수 있습니다. –

+0

프로젝트 수준의 종속성 상황이 발생할 수 있다는 것을 "알게되었습니다"...하지만 솔루션 수준의 종속성 관리는 나에게 훨씬 더 주류처럼 보일 수 있으며 프로젝트 수준의 종속성은 더 많은 경우가 있습니다. 왜 누에 트가 그 배를 놓 쳤는지 나는 잘 모르겠지만 ...... 나는 서랍에서 가장 날카로운 칼이 아니다. – granadaCoder

답변

3

Nuget을 사용하면 프로젝트에 자동으로 포함 된 .targets 파일을 배포 할 수 있습니다 (Nuget docs 참조). 요요 당신은 사용자 정의 대상 파일에 조건부 참조를 포함시키고 패키지의 tools 폴더에 dll을 배포하여 Nuget이 자동으로 참조로 추가하지 않도록 할 수 있습니다.

귀하의 패키지 이름이 'PackageWithConditionalReferences'라고 가정합니다. 당신의 nuget 패키지가 다음과 같을 수에서 생성되는 폴더 구조 : PackageWithConditionalReferences.targets는 내용이

tools 
    lib\net45\x86\xxxx.dll 
    lib\net45\x64\xxxx.dll 
    lib\net45\AnyCPU\xxxx.dll 
build 
    PackageWithConditionalReferences.targets 

:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup>  
    <MyLibDir>$(MSBuildThisFileDirectory)..\tools\net45</MyLibDir> 
    </PropertyGroup> 

    <ItemGroup> 
    <Reference Include="xxxx", Condition="'$(Platform)' == 'x64'"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>$(MyLibDir)\x64\xxxx.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="xxxx", Condition="'$(Platform)' == 'x86'"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>$(MyLibDir)\x86\xxxx.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    <Reference Include="xxxx", Condition="'$(Platform)' == 'AnyCPU'"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>$(MyLibDir)\AnyCPU\xxxx.dll</HintPath> 
     <Private>True</Private> 
    </Reference> 
    </ItemGroup> 

</Project> 

이 있는지 확인 .targets 파일의 이름은 패키지를 좋아했다. 패키지를 설치 한 후 참조가 표시되도록 VisualStudio를 다시 시작해야합니다 (VisualStudio 2015로 테스트).