2017-10-23 5 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 .NET標準に対してコンパイルされた.NET 4.6.2とMicrosoft.Extensions.Configurationに対してコンパイル1.1。したがって、4.6.2がインストールされたマシンで動作するはずです。 4.6.2にはこの新しいバージョンのSystem.Net.Http 4.1.0.0が含まれていません

NuGetとMsBuildが私のアセンブリの直接参照をパッケージIの過渡的な依存関係のバージョンにアップグレードするのを止める方法は私の質問ですつかいます?

ありがとうございます。

+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> 

を、私はそれを自分で試したことがないが、これは理論的には動作するはずです。 Hereは、AutoUnifyAssemblyReferencesフラグをfalseに設定するために上書きできるすべてのターゲット名のリンクです。

+0

ありがとうございました。余りにもこれをプロジェクトレベルで制御することはできません。ビルドマシン上のファイルを変更すると、他のビルドが妨げられ、VSTSエージェントのストッパーになります。 –

+0

プロジェクトレベルでも制御できますが、自分で試したことはありません。これを達成するためのステップで答えを更新しました。 – ThePretendProgrammer

関連する問題