2017-10-23 6 views
0

간단한 참조로 .csproj 프로젝트를 만들었습니다. 나는 또한 NuGet에 대한 project.json 한NuGet을 사용할 때 참조 업그레이드를 방지하는 방법

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0"> 
... 
    <ItemGroup> 
    <Reference Include="System.Net.Http" /> 
    </ItemGroup> 
... 

{ 
    "dependencies": { 
    "SomePackage": "1.1.1-beta", 
    }, 
    "runtimes": { 
    "win": {} 
    }, 
... 

그것은이 설정으로 잘 작동하는 데 사용하는 참조합니다. 그러나 최근 "SomePackage는"이적 종속성의 무리를 통해 NETStandard.Library에 따라 다른 패키지에 의존하기 시작했다 "버전 ="1.6.1 "

<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> 
    <metadata> 
    <id>Microsoft.Extensions.Configuration</id> 
    <version>1.1.0</version> 
    <dependencies> 
     <group targetFramework=".NETStandard1.1"> 
     <dependency id="Microsoft.Extensions.Configuration.Abstractions" version="1.1.0" /> 
     <dependency id="NETStandard.Library" version="1.6.1" /> 
     </group> 
    </dependencies> 
    </metadata> 
</package> 

NETStandard.Library은 System.Net의 최신 버전에 따라 달라집니다. HTTP를 4.1.0.0

내가 프로젝트를 컴파일 할 때, 조립은 직접 새로운 버전 System.Net.Http를 참조하기 시작합니다.

그리고 당연히 런타임이 DLL을 요구하기 시작합니다.

I 닷넷 4.6.2 및 .Net 표준 1.1에 대해 컴파일 된 Microsoft.Extensions.Configuration에 대해 컴파일하십시오. 따라서 4.6.2가 설치된 컴퓨터에서 작동해야합니다. 그러나 4.6.2 System.Net.Http 4.1.0.0이 새로운 버전이 포함되어 있지 않습니다

그래서 내 질문은 내 어셈블리의 직접적인 참조를 패키지의 전이 의존성 버전으로 업그레이드하는 것을 멈출 수있는 방법입니다. 용도?

감사합니다.

+0

MsBuild의 AutoUnify 기능 때문입니다. 그러나 AutoUnify에 대한 정보는 거의 없습니다. 그리고 그것을 끄는 방법이 명확하지 않습니다. –

답변

0

유일한 어셈블리 참조가 걱정된다면 AutoUnifyAssemblyReferences을 (를) 답변하십시오. Visual Studio 2017을 사용하는 경우 C:\Program Files (x86)\MSBuild\14.0\Bin 경로 (또는 해당 MSBuild 버전이 설치된 경로)로 이동하여 Microsoft.CSharp.targets 파일을 검색하십시오. 이 파일은 Visual Studio와 MSBuild에서 솔루션을 빌드하는 데 사용하는 대상 파일입니다. 이 파일 내에서 다음 태그를 추가 할 수 있습니다.

<AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences> 

이러한 변경 후에 파일을 저장하십시오. 이후의 모든 빌드는 자동 어셈블리 버전 업그레이드를 방해합니다. 경고 :이 설정은 특정 버전의 Visual Studio/MSBuild를 사용하여 빌드 한 모든 프로젝트에 적용됩니다. 문제점이 해결되면 대상 파일의 원래 버전으로 되돌릴 수 있습니다.

NuGet 자동 업그레이드를 방지하려면이 문제를 해결하는 this 스택 오버플로 게시물을 참조하십시오.

편집 : 프로젝트 수준에서이를 제어하려면 여기에서 수행 할 수 있습니다. 당신의 csproj 파일에서 <Target> 태그 (이 주석으로 처리 할 수 ​​있음)으로 섹션을 식별하고 다음과 같이 수정 :

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
     <Target Name="BeforeResolveReference"> 
     <AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences> 
     </Target> 
    </Import> 

를 내가 나 자신을 해본 적이 있지만, 이것은 이론적으로 작동합니다. HereAutoUnifyAssemblyReferences 플래그를 false로 설정하기 위해 재정의 할 수있는 모든 대상 이름의 링크입니다.

+0

답변 해 주셔서 감사합니다. 너무 자면 프로젝트 레벨에서 제어 할 수 없습니다.빌드 머신에서 파일을 수정하면 다른 빌드를 방해 할 것이고 VSTS 에이전트가 거의 없어집니다. –

+0

프로젝트 레벨에서도 제어 할 수 있지만 직접 시도한 적이 없습니다. 이를 달성하기위한 단계로 답변을 업데이트했습니다. – ThePretendProgrammer