web-dev-qa-db-ja.com

NugetはMicrosoft.Net.Compilers.1.0.0を復元できません

Nuget Package Managerを使用してVS 2017にMicrosoft.Net.Compilers.1.0.0をインストール/復元しようとしています。出力では、復元が完了したことが示されています。ただし、packagesフォルダーをチェックすると、Microsoft.Net.Compilersフォルダーが表示されません。そのため、エラーが発生します

重大度コード説明プロジェクトファイル行抑制状態エラーこのプロジェクトは、このコンピューターにないNuGetパッケージを参照しています。 NuGet Package Restoreを使用してダウンロードします。詳細については、 http://go.Microsoft.com/fwlink/?LinkID=322105 を参照してください。不足しているファイルは....\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.propsです。 XXXXX\Src\Api\Api.csproj 296

Csprojファイルでは、一番上に行があります

<Import Project="..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />

背景
この問題は、ターゲットフレームワーク4.6.2を使用するWeb APIプロジェクトで発生しています。また、さまざまな種類の.NETアプリケーションと共有するNET Standard 1.4ライブラリもあります。 NET Standard Libraryの参照をWeb APIプロジェクトに追加すると、 依存関係の問題がありません になります。したがって、提案に従って、.csprojファイルを編集して追加しました

  <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

これにより、依存関係の欠落の問題が修正されました。

次に、package.configファイルを削除し、packagesフォルダーからすべてのパッケージを削除し、すべてのパッケージを追加し直しました(Microsoft.Net.Compilersを追加できなかった場合を除く)。パッケージ参照は現在.csprojファイルにあります

そこに [〜#〜] so [〜#〜] ここに投稿しますが、私の場合、Microsoft.Net.Compilerspackagesフォルダーに復元されません。 VS 2017は復元が完了したことを示していますが、実際にファイルをコピーしている場所はわかりません。 (フォルダー名がMicrosoft.Net.Compilersと異なる場合を除く)

私の元のpackage.configファイルにはこの行があります

<package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net462" developmentDependency="true" />

今.csprojファイルに私が持っています

   <PackageReference Include="Microsoft.Net.Compilers">
      <Version>1.0.0</Version>
    </PackageReference>

更新1
したがって、packagereferenceを有効にすると、nugetはC:\Users\{username}\.nuget\packagesフォルダーにパッケージをインストールします

つまり、csprojファイルを正しい相対パスで更新する必要があります。

パッケージフォルダーの相対パスは何ですか?

10
LP13

Package Management FormatをPackageReferenceに設定すると、パッケージがC:\Users\{username}\.nuget\packagesであるグローバルnugerフォルダーにインストールされるため、csprojファイルを編集する必要があり、次の行を更新します

csprojの上部

<Import Project="$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
  <Import Project="$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.1.0\build\Microsoft.Net.Compilers.props')" />

そして、csprojの下部にある次の行を更新します

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.Microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '$(UserProfile)\.nuget\packages\Microsoft.Net.Compilers\2.1.0\build\Microsoft.Net.Compilers.props'))" />
    <Error Condition="!Exists('$(UserProfile)\.nuget\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '$(UserProfile)\.nuget\packages\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform\1.0.7\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
  </Target>

これらはすべて、NET Standard 1.4プロジェクトを.NET 4.6.2に参照するためのものです。とてもうるさい!!

9
LP13

私の場合、完全なslnを含まないGitHubからプロジェクトをダウンロードしましたが、同じレベルの.csprojとpackagesフォルダーを持つ単一のフォルダーでした。

この場合、.csprojファイルの「..\packages \」を「。\ packages \」に置き換えるだけで済みました。 GitHubリポジトリの所有者がプロジェクトフォルダーのみをアップロードすることを決定したが、アップロードする前にテストするために再コンパイルしなかったと思われます。

2
Dirk Wessels

@ LP13の答えは正しい方向を示してくれました。私は別のことをしなければならなかったけれども。

私の.csprojファイルには、Microsoft.Net.Compliersへの2つの参照があります。 2.9.0(現在使用しているもの)と1.2.1(古いバージョン)用です。

ファイルの先頭で、参照した2つのImport Project行をコメントアウトしました。

  • Import Project = "。\ packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1 ...

  • Import Project = "。\ packages\Microsoft.Net.Compilers.1.2.1 ...

ファイルの下部で、同じrefrencesのエラー条件エントリで同じことを行います。

  • エラーCondition = "!Exists( '。\ packages\Microsoft.Net.Compilers.1.2.1 ...
  • エラーCondition = "!Exists( '。\ packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1' ...
1
Jeff Blumenthal