NuGetのパッケージの場所を変更することはできますか?


283

私のプロジェクトのほとんどには、次のような規約があります。

/src
    /Solution.sln
    /SolutionFolder
        /Project1
        /Project2
        /etc..
/lib
    /Moq
        moq.dll
        license.txt
    /Yui-Compressor
        yui.compressor.dll
/tools
    /ILMerge
        ilmerge.exe

私は、ソースフォルダー内に外部ライブラリー保持していないことに気付くでしょう。NuGetの使用にも非常に興味がありますが、これらの外部ライブラリをソースフォルダー内に配置したくありません。NuGetには、すべてのパッケージが読み込まれるディレクトリを変更する設定がありますか?


10
はいはいはい!これはまさに私が使用している(または非常に近い)プロジェクト構造であり、NuGetがそれをサポートできるといつも思っていました...
Noldorin

この方法については、次の回答で詳しく説明しました:stackoverflow.com/a/19466173/564726。正しく機能するために、restoreコマンドからsolutionDirオプションを削除する必要があることがよくあります。
BrutalDev 2013年

2
.slnを最上位のフォルダーと同じレベルに配置します。:)
Ian Warburton 2014年

回答:


242

パッケージをインストールするフォルダーを制御できるようになりました。

http://nuget.codeplex.com/workitem/215

編集: 2010年12月10日午後11時45分(上記の作業項目/リンク)にあるPhil Haackのコメントを参照してください。サポートは1.0で部分的に実装されていますが、文書化されていません。

@dfowlerによると、次のようにして、ソリューションの横にnuget.configファイルを追加します。

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

パッケージフォルダーのオーバーライドを作成するためのnugetパッケージがあります。

バージョン2.1の更新

Azatがコメントしたように、パッケージの場所を制御する方法についての公式ドキュメントがあります。2.1リリースノートでは、nuget.configファイルで次の構成を指定しています(構成ファイルを配置する有効な場所と階層構成モデルのしくみについては、リリースノートを参照してください)。

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

これにより、ファイルを配置した構成レベルのパッケージフォルダーが変更されます(ソリューションディレクトリに配置した場合のソリューション、プロジェクトディレクトリ内のプロジェクトなど)。リリースノートには次のように記載されています。

[...]ソリューションルートの下に既存のパッケージフォルダーがある場合は、NuGetが新しい場所にパッケージを配置する前に、フォルダーを削除する必要があります。


5
上記の設定ファイルを使用することで実際に可能です。それが強調されなかった理由は、UIやその他の手段を通じてこれを有効にするワークフローを通過していないため、多少の奇妙さを期待しているためです。
davidfowl 2011年

5
nuget.configがどのように機能するかについての@dfowlerによる詳細な説明については、reviewboard.nupack.com / r / 131を参照してください。たとえば、有効なnuget.configは次のようになります:<settings> <repositoryPath> lib </ repositoryPath> </ settings>
Lee Harold

5
docs.nuget.org/docs/release-notes/nuget-2.1「 'packages'フォルダーの場所を指定する」の段落を参照
Azat

1
2.1以降の新しい方法で動作しないことを確認できます。そして、codeplexにそれに関するバグがあります:nuget.codeplex.com/workitem/2921
ケース

5
2番目のバージョンは私にとってはうまくいきます。私は最新のNuGetを使用し、2つのソリューションが同じリポジトリを共有できるようになりました。絶対パスを使用する可能性があるため、一部のユーザーでは機能しない可能性があると思いますか?絶対パスと相対パスが重要であるようです。
Csaba Toth 2013

63
  1. 「nuget.config」というファイルを作成しました。
  2. そのファイルをソリューションフォルダに追加しました

これは私にとってはうまくいきませんでした:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

これは私にとってうまくいきました:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>

こっちも一緒。構成>構成は機能しませんでしたが、設定> repositoryPathは機能しました。
Gene Reddick 2013年

唯一の第二の溶液の作品:docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly

15
使用しているNuGetのバージョンによって異なります。
Bronumski 2013年

1
相対パスはソリューションに対する相対パスなので、プロジェクトが異なるレベルにある場合は機能しません。
Nine Tails

2
これはVIsual Studio 2013では問題なく動作しますが、Visual Studio 2015を使用している場合でも、slnファイルの近くのパッケージフォルダーにパッケージをインストールします
fhnaseer

40

この投稿を読んでいる人のために、わかりました。これが、上記の無数の回答について私が理解していることです。

  1. .nu​​getフォルダー内のnuget.configファイルは、そのフォルダーを基準にしています。新しいフォルダが「../Packages」のような場合は、常にそのままの状態で配置されるため、これは重要です。@ bruce14が示すように、代わりに '../../Packages'を実行する必要があります

  2. 最新のnuget(2.8.5)を入手して、パッケージの復元を有効にしないと、標準の場所の外にあるパッケージフォルダーを見つけることができませんでした。したがって、パッケージの復元を有効にしたら、次を.nugetフォルダー内のnuget.configファイルに追加して、場所を変更する必要があります。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  3. (これは重要です)あなたはnuget.configファイルのパッケージフォルダの場所の内部を変更した場合、あなたがしなければならないのVisual Studioを再起動するか、近い/変更を有効にするためのソリューションをリロード


5
私を信じて、あなたの#3ポイントが私の一日を救った。最後の3時間から、あなたの#3ポイントを読むまで、私は夢中になりました。: '(
本当に

24

Visual Studio 2015でのNuget 3.2のソリューションは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

親フォルダーにスラッシュを使用します。上記のファイル(nuget.config)をソリューションフォルダーに保存します。

参照はここにあります


パーフェクト!Visual Studio 2015とNugetバージョン3.2.0.10516での作業
Anon Dev

あなたはフォワードスラッシュを意味しているようです...しかし、ソリューションがウィンドウ上にある場合、おそらくそのフォワードスラッシュは後方スラッシュに変わるか、おそらくフォワードスラッシュはタイプミスであり、後方スラッシュに変更する必要があります。
Gerard ONeill 2016

私は2015年です。1つ上のフォルダに移動するには、.. \ .. \ Packagesを使用する必要があります。
Rhyous

1
../libこれはバックスラッシュではなく、フォワードスラッシュです。どういう意味?
jpmc26

はい、正確にスラッシュです。回答の更新
phuongnd

15

2.1のリリースノートで提案されているソリューションは、そのままでは機能しません。彼らはコードがあることを言及するのを忘れていました:

internal string ResolveInstallPath()
{
    if (!string.IsNullOrEmpty(this.OutputDirectory))
    {
        return this.OutputDirectory;
    }
    ISettings settings = this._configSettings;

    ...
}

機能しなくなります。これを修正するには、NuGet.targetsファイルを変更し、「OutputDirectory」パラメーターを削除する必要があります。

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

したがって、NuGet.configのどこかに「repositoryPath」構成を追加すると(構成ファイルを配置する有効な場所の説明については、リリースノートを参照してください)、すべてのパッケージが単一の場所に復元されますが、.csprojはまだ相対パスとして記述されたアセンブリへのヒントが含まれています...

PackageManagerを変更するのではなく、なぜ彼らが一生懸命行ったのかまだ理解できません。そのため、PackagesDirに相対的なヒントパスが追加されます。これは、ローカル(デスクトップ上)とビルドエージェントで異なるパッケージの場所を手動で設定する方法です。

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>

1
あなたは、絶対に正しい。私の会社では、実際に、自分が変更したNuGetのバージョンを使用しています。つまり、プロジェクトファイルの場所ではなく、パッケージディレクトリに相対的なヒントパスを追加しています。これは完璧に機能します。残念ながら、NuGetに加えた変更を公式バージョンに
取り込も

1
@afrischke:できればそれは素晴らしいことです。ありがとう。これが起こる可能性があるときの考えは?
sgtz 2013年

11

Shane Kmsの回答に加えて、Nuget Package Restoreをアクティブにした場合は、.nuget-folderにあるNuGet.configを次のように編集します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

余分な ".. \"に注意してください。これは、ソリューションフォルダーではなく.nuget-folderからバックトラックするためです。


9

いくつかのヒントがないため、この回答のどれも私にとってはうまくいかなかった(Nuget 2.8.6)。他の人に役立つかもしれないので、ここでそれらを追加しようとします。

次のソースを読んだ後:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
それはと思われます

  1. あなたが使用する必要が異なるリポジトで正しくインストール・パッケージを操作できるようにするに前進彼らはパースの場所にURIオブジェクトを使用しているので、それはだ、スラッシュを。
  2. 初めに$がなければ、それでも私の設定は無視されていました。
  3. NuGetは構成ファイルをキャッシュするため、変更後にソリューション/ VSをリロードする必要があります。
  4. また、NuGet.exeのコマンドを使用してこのオプションを設定すると、AppData \ Roaming \ NuGetの下にあるグローバルNuGet.exeが変更され、そこにパッケージの復元が開始されたため、奇妙な問題が発生しました(そのファイルの優先度が高いため、推測しています)。

例えば

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

NuGetコマンドを使用して、次のように構文が正しいことを確認することもできます。

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config

8

.NET CoreプロジェクトとVisual Studio 2017の場合、次の構成を提供することで、すべてのパッケージを相対パスに復元できました。

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

私の経験に基づいて、libフォルダーは、slnファイルがどこにあってもNuget.configが見つかったのと同じレベルに作成されました。私はテストしましたが、動作はコマンドラインドットネットリストアとVisual Studio 2017再構築で同じです


私はこれを試しました。globalPackagesFolderプロジェクトのパッケージフォルダーにキーを設定しました。で単一のパッケージを追加しようとしましたdotnet add package MyPackagenuget.exe83個の.NETパッケージのフレームワーク全体をそのフォルダーにダウンロードしました。それは私が意図したものではありません。ローカルのソース管理されたパッケージフォルダーに単一のMyPackageが欲しいだけです。
ウォレスケリー

やめてください!これにより、新しいアプリを作成するたびにフレームワークパッケージ全体がダウンロードされるため、HDDにかなりの負荷がかかります。
Alaa Masoud

1
別の質問に対するこの回答に従って:stackoverflow.com/a/47407399/4572240 "respositoryPathはpackages.configプロジェクトに使用され、globalPackagesFolderはPackageReferenceプロジェクトに使用されます"。
Siderite Zackwehdex

7

承認された回答の構成ファイルは、VS2012で動作します。ただし、私にとっては、次の操作を行った場合にのみ機能します。

  1. VSで新しいプロジェクトを作成します。
  2. VSを終了-これは重要なようです。
  3. 構成ファイルをプロジェクトフォルダにコピーします。
  4. VSを再起動してパッケージを追加します。

これらの手順に従うと、共有パッケージフォルダーを使用できます。


これを機能させる唯一の方法は、VSの再起動です。パッケージマネージャーがそれをキャッシュすることを推測します。
2013年

6

packages.configの代わりにPackageReferenceを使用してプロジェクトのパスを変更するには、使用する必要があります globalPackagesFolder

https://docs.microsoft.com/en-us/nuget/reference/nuget-config-fileから

globalPackagesFolder(PackageReferenceを使用するプロジェクトのみ)

デフォルトのグローバルパッケージフォルダーの場所。デフォルトは%userprofile%.nuget \ packages(Windows)または〜/ .nuget / packages(Mac / Linux)です。相対パスは、プロジェクト固有のnuget.configファイルで使用できます。この設定は、優先されるNUGET_PACKAGES環境変数によって上書きされます。

repositoryPath(packages.configのみ)

デフォルトの$(Solutiondir)/ packagesフォルダーの代わりにNuGetパッケージをインストールする場所。相対パスは、プロジェクト固有のnuget.configファイルで使用できます。この設定は、優先されるNUGET_PACKAGES環境変数によって上書きされます。

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

Nuget.configをソリューションファイルの横に配置すると、うまくいきました。


5

私が発見したもう1つの小さなヒント。(これは非常に基本的で、一部の人が言及しなかったかもしれませんが、私の解決策にとって重要でした。) "packages"フォルダは、最終的に.slnファイルと同じフォルダに含まれます。

.slnファイルを移動し、内部のすべてのパスを修正して、さまざまなプロジェクトと出来上がりを見つけました!私たちのpackagesフォルダは私たちが望んでいた場所に行き着きました。


4

VS 2017の更新:

Nugetチームの人々がようやくNugetを使い始め、いくつかの重要なものを見つけて修正するのに役立ちました。したがって、今でも(私が誤っていない場合は、VS 2017にまだ移行されていないため)、以下は不要です。"repositoryPath"をローカルフォルダーに設定できれば機能します。既定では復元場所がソリューションフォルダーからマシンレベルに移動されるため、このままにすることもできます。繰り返します-私はまだ自分でテストしていません

VS 2015以前

他の回答へのヒント(具体的にはこれ):

NuGet Packageフォルダーの場所は構成によって変更できますが、VisualStudioはこのフォルダー内のアセンブリを相対的に参照します。

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

これを回避するには(より良い解決策になるまで)、substコマンドを使用して、Packagesフォルダーの新しい場所を指す仮想ドライブを作成しました。

subst N: C:\Development\NuGet\Packages

新しいNuGetパッケージを追加するとき、プロジェクト参照はその絶対的な場所を使用します。

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

注意:

  1. そのような仮想ドライブは再起動後に削除されますので、それを処理することを確認してください
  2. プロジェクトファイル内の既存の参照を置き換えることを忘れないでください。

今日もそうですか?新しく追加されたパッケージにabsouluteロケーションを使用できないのですか?この仮想ドライブソリューションは私には扱いにくいように見えます
batmaci '17 / 11/16

うん、まだ何も変わっていないのでケース
カマレイ

2
私は実際には相対パスを好みます。そうすれば、異なる開発者がコードの異なるルート位置を持っている場合でも、ソース管理に矛盾が生じません。
jbyrd 2017

どうしてできないのかな <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> 使用するのではなくsubst
あるVinod Srivastav

ソリューションごとではなく、すべてのパッケージを1か所に配置したかった
Kamarey

3

Nuget 2.8.3で更新するだけです。インストールされたパッケージの場所を変更するために、右クリックソリューションからパッケージの復元を有効にしました。NuGet.Configを編集し、次の行を追加しました:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

次に、ソリューションを再構築し、すべてのパッケージを目的のフォルダーにダウンロードし、参照を自動的に更新しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.