NuGet otomatik paket geri yüklemesi MSBuild ile çalışmıyor


111

MSBuild 12.0 ile packagesiçeriği eksik ( repositories.configiçerisi hariç ) bir çözüm oluşturmaya çalışıyorum . Oluşturmadan önce tüm eksik paketleri otomatik olarak geri yüklemesini bekliyorum, ancak durum böyle değil - MsBuild tonlarca hata bildiriyor:

"bir kullanma yönergesi veya bir derleme başvurusu eksik mi?"

NuGet Manager 2.7'dir (bunu Visual Studio 2013'te box hakkında görüyorum). EnableNuGetPackageRestore=trueParametreyi bile geçmeye çalıştım - şans yok. Neyi kaçırıyorum?


Çözümü Visual Studio içinde mi oluşturuyorsunuz? Ayrıca, Paket Geri Yükleme bölümündeki Paket Yöneticisi Ayarlarında her şey işaretlendi mi? Visual Studio içinde oluşturuyor ve NuGet 2.7 veya üstünü kullanıyorsanız .nuget klasörüne ihtiyacınız yoktur.
Matt Ward

1
Hayır, komut satırından en son MsBuild ( msdn.microsoft.com/en-us/library/hh162058.aspx ) sürümünü kullanıyorum . Nuget, VS'den 2.8'e güncellendi - şans yok.
UserControl

3
MSBuild tek başına ve VS eklentisi de geri yüklenmez. @KMoraz'ın dediği gibi paket geri yüklemeyi etkinleştirmeniz gerekir ve ardından Sumeshk'in dediği gibi .nuget klasörü görünür ve paketler geri yüklenebilir. Kaynak denetimine .nuget'i işaretlediğinizden emin olun.
Lex Li

Yanıtlar:


36

V3.3.0'dan itibaren en son resmi NuGet belgeleriyle GÜNCELLENMİŞTİR

Paket Geri Yükleme Yaklaşımları

NuGet, paket geri yüklemeyi kullanmak için üç yaklaşım sunar .


Otomatik Paket Geri Yükleme , NuGet ekibinin Visual Studio içinde Paket Geri Yükleme için önerdiği yaklaşımdır ve NuGet 2.7'de kullanıma sunulmuştur. NuGet 2.7 ile başlayarak, NuGet Visual Studio uzantısı, Visual Studio'nun derleme olaylarıyla bütünleşir ve bir derleme başladığında eksik paketleri geri yükler. Bu özellik varsayılan olarak etkindir, ancak geliştiriciler isterlerse vazgeçebilirler.


Şu şekilde çalışır:

  1. Proje veya çözüm derlemesinde, Visual Studio çözüm içinde bir derlemenin başladığı bir olay oluşturur.
  2. NuGet bu olaya yanıt verir ve çözüme dahil edilen packages.config dosyalarını denetler.
  3. Bulunan her bir packages.config dosyası için, paketleri numaralandırılır ve Kontrol edilenler çözümün paketler klasöründe bulunur.
  4. Eksik paketler, paket kaynaklarının sırasına göre kullanıcının yapılandırılmış (ve etkinleştirilmiş) paket kaynaklarından indirilir.
  5. Paketler indirilirken, çözümün paketler klasörüne açılırlar.

Nuget 2.7+ kurulu ise; Visual Studio'da Otomatik Paket Geri Yükleme'yi yönetmek> için bir yöntem seçmek önemlidir.

İki yöntem mevcuttur:

  1. (Nuget 2.7+): Visual Studio -> Araçlar -> Paket Yöneticisi -> Paket Yöneticisi Ayarları -> Otomatik Paket Geri Yüklemeyi Etkinleştir
  2. (Nuget 2.6 ve altı) Bir çözüme sağ tıklayın ve "Bu çözüm için Paket Geri Yüklemeyi Etkinleştir" seçeneğine tıklayın.


Komut satırından bir çözüm oluştururken Komut Satırı Paketi Geri Yükleme gereklidir; NuGet'in ilk sürümlerinde tanıtıldı, ancak NuGet 2.7'de iyileştirildi.

nuget.exe restore contoso.sln

MSBuild ile tümleşik paket geri yükleme yaklaşımı, orijinal Paket Geri Yükleme uygulamasıdır ve birçok senaryoda çalışmaya devam etse de, diğer iki yaklaşımın ele aldığı tüm senaryoları kapsamaz.


63
Bu artık nuget tarafından tavsiye edilmiyor. Dokümanlara bakın. docs.nuget.org/docs/workflows/…
Owen Johnson

@OwenJohnson, bu belge görebildiğim kadarıyla tarihli değil ve şimdi tavsiye edilmediğini nasıl söylediğini görmüyorum? VS2013'teyim ve bu düğme iyi çalışıyor gibi görünüyor. Başvurulan soruna sahip değildim, "Demek" Nuget Paketi Geri Yüklemeyi Etkinleştir "i tıkladınız ve artık öğeleriniz oluşturulmuyor. Düzeltme adımları zahmetli ancak bu komut dosyasıyla daha az zahmetli ." Github.com/owen2/ AutomaticPackageRestoreMigrationScript Belki de bunu daha ayrıntılı açıklayan başka bir belge vardır.
AnneTheAgile

5
Otomatik paket geri yükleme, ms-build tümleşik geri yüklemesinin yerini alır. Belge, nasıl yükseltileceğine ilişkin talimatlardır. Msbuild ile tümleşik yöntemle sorun yaşamıyorsanız, hiçbir şey yapmanıza gerek yoktur. En basit durumlarda, işe yarıyor, ancak CI sunucularınız, paylaşılan proje referanslarınız veya diğer bazı koşullarınız varsa, bazı kötü kara mayınlarına basabilir ve yanlış ipuçları veya başka sorunlarınız olabilir.
Owen Johnson

1
Bu yanıtı kullanarak VE docs.nuget.org/consume/package-restore/… adresindeki "eski şeyleri kaldırma" talimatlarını " Taşıma gerçekleştirme " yaparak başarıyı yakaladım.
granadaCoder

NuGet 4 ve .net standardıyla işler yeniden değişmiş gibi görünüyor.
Owen Johnson

239

Eğer MSBuild 15 veya üstü ile gemi daha sonra Visual Studio 2017 veya kullanıyorsanız ve .Csproj dosyalarında olan yeni PackageReferenceformatta , basit yöntem olan yeni MSBuild kullanmak Restorehedefi .


Hiç kimse, "MSBuild ile komut satırından derleme yaparken NuGet paketlerini otomatik olarak geri yüklemek için nasıl elde edebilirim?" Sorusunu yanıtlamadı. Cevap şudur: "NuGet paketini geri yüklemeyi etkinleştir" seçeneğini kullanmadığınız sürece ( bu referansa göre artık kullanımdan kaldırılmıştır ), yapamazsınız (ancak aşağıya bakın). Örneğin bir CI sunucusunda otomatik derlemeler yapmaya çalışıyorsanız, bu berbattır.

Bununla birlikte, istenen davranışı elde etmenin biraz dolambaçlı bir yolu vardır:

  1. En son NuGet yürütülebilir dosyasını https://dist.nuget.org/win-x86-commandline/latest/nuget.exe adresinden indirin ve PATH'nizde bir yere yerleştirin. (Bunu bir ön oluşturma adımı olarak yapabilirsiniz.)
  2. nuget restoreTüm eksik paketleri otomatik olarak indirecek olan çalıştırın .
  3. msbuildÇözümünüzü oluşturmak için çalıştırın .

Bir kenara: otomatik paket geri yüklemesi yapmanın yeni ve önerilen yolu sürüm kontrolünüzde daha az dağınıklık içeriyor olsa da, indirme ve çalıştırma gibi fazladan çemberden geçmediğiniz sürece komut satırı paketi geri yüklemesini imkansız kılar nuget.exe. İlerleme?


Benzer bir çözümle sonuçlandı (ancak nuget.exe/ trunk / ext konumuna yerleştirildi ). Bir adım ileri - iki adım geri :(
UserControl

40
Bu doğru bir cevap olmalı, işaretlenen değil.
Woland

Bu, konuya geldiğinde gerçekten biraz sezgisel gibi görünüyor, ancak komut satırını kullanarak belirli nuget paketlerini geri eklemek için gerçekten daha fazla işlev elde edersiniz. Otomatik geri yükleme başarısız olduğu sürece bu çözüm benim için çalıştı.
TGarrett

2
Jenkins kullanıyordum ve bunu yapmak zorundaydım, bu msbuild'i çağırmadan önce basit bir yapı adımıydı - Windows toplu iş dosyası, derleme adımı tipiydi ve: cmd.exe / c "C: \ Program Files \ nuget \ nuget.exe" restore < RelativePathToSln> .sln - SLN yolunu, sln dosyasını bulamaması ihtimaline karşı bir alışkanlık / prosedür olarak yaptım.
Steve Radich-BitShop.com

1
Bu yaklaşım, bir Jenkins yapısında bir geri yükleme kurarken benim için çalıştı. Benim için önemli bir anahtar NuGet.Config olmasıydı vardı benim .sln dosyasıyla aynı dizinde olması için. Komut satırında -ConfigFile belirtilmesi dahil olmak üzere diğer yapılandırma dosyası konumlarının hiçbir kombinasyonu çalışmaz.
Guerry

56

Nuget'in Otomatik Paket Geri Yükleme özelliği, MSBuild'in değil, Visual Studio'nun (2013'ten itibaren) bir özelliğidir. nuget.exe restorePaketleri komut satırından geri yüklemek istiyorsanız çalıştırmanız gerekecek .

Ayrıca Nuget Paketi Geri Yüklemeyi Etkinleştir özelliğini de kullanabilirsiniz, ancak bu artık nuget üyeleri tarafından önerilmemektedir, çünkü proje dosyalarında izinsiz değişiklikler yapar ve bu projeleri başka bir çözümde oluşturursanız sorunlara neden olabilir.


2
NuGet sürümünüz en az 2.7 değilse geri yükleme komutunu kullanmadan önce "nuget update -self" komutunu çalıştırmanız gerekir. NuGet'im sürüm 2.1'di ve güncellemeden önce "geri yükle" komutunu tanımıyordu.
Teknikaali

2
"Bu projeleri başka bir çözümde inşa ederseniz sorunlara neden olur" Henüz herhangi bir sorunla karşılaşmadım ve her biri düzinelerce projeden oluşan 3 çözümümüz var (çoğu çözümler arasında paylaşılıyor). Belki şanslıyım?
Nelson Rothermel

@NelsonRothermel meydana gelebilecek en önemli sorunlu durum, nuget ile teslim edilen dll'leri yabancı bir çözümün paketler klasörüne yönlendiren projelerdir, bu da bir çözüm oluşturduğunuzda kullanılamayabilir.
Owen Johnson

2
@OwenJohnson Tüm çözümler için ortak bir paket klasörümüz var, bu yüzden muhtemelen sorunla karşılaşmadık.
Nelson Rothermel

17

Resmin tamamını anlamam biraz zaman aldı ve burada paylaşmak istiyorum.

Visual Studio'nun paket geri yüklemeyi kullanmak için iki yaklaşımı vardır: Otomatik Paket Geri Yükleme ve MSBuild-Tümleşik paket geri yükleme. 'MSBuild-Integrated Package Restore', bazı senaryolarda sorunlara neden olabilecek oluşturma işlemi SIRASINDA paketleri geri yükler. 'Otomatik Paket Geri Yükleme', NuGet ekibi tarafından önerilen yaklaşımdır .

'Otomatik Paket Geri Yükleme'nin çalışmasını sağlamak için birkaç adım vardır:

  1. Visual Studio'da Araçlar -> Uzantılar ve Güncellemeler, daha yeni bir sürüm varsa NuGet'i Yükseltme (Sürüm 2.7 veya üzeri)

  2. TFS kullanıyorsanız, çözümünüzün .nuget klasöründe NuGet.exe ve NuGet.targes dosyalarını kaldırın. Ardından NuGet paketlerini kontrol etmemek için NuGet.Config'i düzenleyin:

    <configuration>  
      <solution>  
        <add key="disableSourceControlIntegration" value="true" />  
      </solution>  
    </configuration> 

    Daha önce çözümün paketler klasörünü TFS'ye teslim ettiyseniz, klasörü silin ve paket klasörünün silinmesini kontrol edin.

    TFS kullanmıyorsanız, .nuget klasörünü silin.

  3. Çözümünüzdeki her proje dosyasında (.csproj veya .vbproj) NuGet.targets dosyasına başvuran satırı kaldırın. Referans şuna benzer:

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

    Çözümünüzdeki her proje dosyasında bu satırı kaldırın.

  4. Visual Studio menüsünde

    Araçlar -> Seçenekler -> Paket Yöneticisi -> Genel veya Araçlar -> NuGet Paket Yöneticisi -> Paket Yöneticisi Ayarları

    lütfen aşağıdaki iki seçeneği etkinleştirin 1) 'NuGet'in eksik paketleri indirmesine izin verin' 2) 'Visual Studio'da derleme sırasında eksik paketleri otomatik olarak kontrol edin'

  5. Paket geri yükleme yapılandırmanızı aşağıdaki adımlarla test edin

    • Çözümünüzü kaydedin ve Visual Studio'yu kapatın
    • Çözümünüzün paketler klasörünü silin
    • Visual Studio'yu başlatın, çözümünüzü açın ve yeniden oluşturun.

1
Adımlarınızdan biri <Import Project = "$ (MSBuildToolsPath) \ Microsoft.CSharp.targets" /> öğesini kaldırmaktır. Neden bunu yapasın ki?
İbrahim Haşimi

3
Bence şablonun kendisinde olan yanılıyorsunuz. Onsuz kaynak dosyalarınız hiç oluşturulmayacaktır.
İbrahim Haşimi

3
Sanırım Microsoft.CSharp.targets yerine nuget.targets'ı kastetti.
Owen Johnson

2
docs.nuget.org/docs/workflows/… <- İşte Ying'in söylemeye çalıştığı şeyle ilgili resmi belgeler.
Owen Johnson

1
Ying haklı ... Herkesin görmezden geldiği şey, Sürekli Entegrasyon yapılarının, derleme öncesi olaylardan SONRA kendi geçici çalışma alanını yaratması, kaynakları elde etmesi ve ardından NuGet referanslarını tıkamasıdır. Bu, TFS derleme otomasyonu için DÜZELTME.
CZahrobsky

5

MSBuild 15, a / t: geri yükleme seçeneğine sahiptir sahiptir. Visual Studio 2017 ile birlikte gelir.

Bunu kullanmak istiyorsanız, yeni PackageReference'ı da kullanmanız gerekir ; bu, packages.configdosyayı aşağıdaki gibi öğelerle değiştirmek anlamına gelir (bunu * .csproj içinde yapın):

<ItemGroup>
  <!-- ... -->
  <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
  <!-- ... -->
</ItemGroup>

'Referanslar' üzerine sağ tıklarsanız bu biçime otomatik bir geçiş vardır (görsel stüdyoyu yeni açarsanız, 'Çözüm için NuGet paketlerini yönet' penceresini yeniden kurarsanız veya açarsanız görünmeyebilir ve görünmeye başlar).


Msbuild'in geri yükleme seçeneğinin nuget geri yüklemeden küçük farklılıkları olduğunu göz önünde bulundurmalısınız - örneğin bkz. Github.com/NuGet/Home/issues/7651#issuecomment-500842049 .
Matthieu

4

Ian Kemp'in cevabı var (bazı noktaları btw ..), bu onun adımlarından birine biraz et eklemektir.

Buraya gelmemin nedeni, geliştiricinin makinelerinin iyi inşa ediyor olmasıydı, ancak yapı sunucusu gerekli paketleri (boş paketler klasörü) indirmiyordu ve bu nedenle yapı başarısız oluyordu. Ancak, yapı sunucusunda oturum açmak ve çözümü manuel olarak oluşturmak işe yaradı.

Ians 3 nokta adımlarının ikincisini gerçekleştirmek için ( nuget geri yüklemeyi çalıştırma ), aşağıdaki gibi nuget geri yükleme komutunu çalıştırmak üzere exec komutunu çalıştıran bir MSBuild hedefi oluşturabilirsiniz (bu durumda nuget.exe, yerine .nuget klasöründedir. yol üzerinde), daha sonra çözümü oluşturmadan hemen önce bir TeamCity oluşturma adımında (diğer CI kullanılabilir ...) çalıştırılabilir.

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

Kayıt için "nuget yükleyici" çalıştırıcı türünü zaten denedim, ancak bu adım web projelerinde asılıydı (DLL'ler ve Windows projeleri için çalıştı)


1
Sürekli olarak yeni bir kod setinden (CI) derliyorsanız, gitmenin yolu budur.
Jahmic

1
Bu yaklaşımı beğendim çünkü her çözümün / projenin birlikte oluşturulduğu nuget sürümüne bağlı olduğunu garanti ediyor. Zamanında bu, nuget'in eski sürümleri kullanılarak oluşturulan eski projelere sahip bir şirkette çalışıyorsanız hayati öneme sahip olabilir. Bir dev, sistem çapında nuget.exe'nin işleri bozup bozmayacağı konusunda endişelenmek zorunda kalmadan bu tür projeleri sürdürebilir, çünkü her projenin kendi nuget.exe "yerel çeşidi" vardır. Son bir ipucu olarak, nuget 3.x + ile paketleri şu şekilde geri yükleyebileceğimizi belirtmekte fayda var: nuget.exe paketleri geri yükle.config -PackagesDirectory yolu \ to \ paketleri
XDS

1
Bu yaklaşımla ilgili sorunum, geri yükleme adımını eklemek için sonraki herhangi bir proje dosyasını düzenlemeniz gerekecek olmasıdır. Bu adımın derleme sunucusunda yürütülmesini sağlamak için TFS2012'de bir "InvokeProcess" etkinliği veya TFS2013 derleme şablonuna bir "NuGetRestore" etkinliği ekleyebilirsiniz. InvokeProcess için 2012'de "SourcesDirectory" özniteliğini iletin. TFS 2013'te, değerleri gerektiği gibi doldurmanız yeterlidir. bunun nasıl yapılacağına dair birçok blog var.
Neville

3

TeamCity'yi bir derleme sunucusu olarak kullanıyorsanız , derleme adımından önce tüm paketleri geri yüklemek için kullanabileceğiniz bir "NuGet Yükleyici" adımı alırsınız.


2

Bir packages.config varProje ile birlikte dosyası var, paket detaylarını içeriyor.

Ayrıca NuGet.exe ve NuGet.targets içeren bir .nuget klasörü vardır . dosyalardan herhangi biri eksikse, eksik paketi geri yüklemeyecek ve "bir kullanma yönergesini veya bir derleme başvurusunu kaçırıyor musunuz?" hata


2
.nugetKlasör yok ve hiç olmadı. packages.configProje klasörlerindeki tüm dosyalar yerinde.
UserControl

NuGet.exe ve NuGet.targets'ın uygulamayı oluştururken tüm eksik paketleri otomatik olarak geri yükleyeceğini düşünüyorum ve NuGet.exe ve NuGet.targets dosyalarınızı kaybettiniz, bu da hatalara neden oluyor
Sumeshk

Yine de teşekkürler -Her türlü yardım için minnettarım!
UserControl

.nuget klasörü, yalnızca otomatik paket geri yüklemeyi etkinleştirdiğinizde görünen, Visual Studio tarafından oluşturulan bir klasördür. Nuget.config gibi derlemelerinizde de başvurabileceğiniz gibi kod deponuzda nuget.exe'ye sahip olmak yararlıdır (özellikle birden çok depodan paket almanız gerekiyorsa).
MytyMyky

2

Bazen bu, geri yüklemeye çalıştığınız paketin klasörüne "paketler" klasörüne (yani "Paketler / EntityFramework.6.0.0 /" ) sahip olduğunuzda ancak "DLL'ler" bu klasörün içinde olmadığında (sürüm kontrolünün çoğu sistemler ".dll" dosyalarını otomatik olarak yok sayar). Bu, NuGet her paketi geri yüklemeyi denemeden önce klasörlerin zaten var olup olmadığını kontrol ettiği için oluşur, bu nedenle varsa, NuGet "dll" nin içinde olduğunu varsayar. Dolayısıyla, sizin için sorun buysa, NuGet'in doğru şekilde geri yükleyeceği klasörü silin.


1
VS 2015 ve TFS için bu sizi düzeltir. Sorun çözülmemiş bir referans olacaktır ve çoğu zaman sorun, nuget paketinin geri yüklenmemesidir çünkü paketin klasörü paketler klasöründe zaten mevcuttur, ancak paket henüz tam olarak genişletilmemiştir. (Bir .dll içermesi gereken bir lib klasörünün olmaması gibi.) Paketlerin içindeki paketin tüm klasörünü silin ve ardından çözüm düzeyinde sağ tıklayın ve paketleri geri yüklemeyi seçin.
Greg

1

Nuget paketlerinin devenv.exe kullanarak sln dosyasını oluşturan her gece komut dosyası içeren bir yapıya dahil edilmemesiyle ilgili bir sorun yaşadım.

Microsoft'un tavsiyesini takip ettim ve temel adım NuGet yapılandırmasını içerecek şekilde güncellemekti %AppData%/NuGet:

<configuration>
    <packageRestore>
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>

Bu yüzden, Visual Studio'daki ayarları değiştirdiğinizde (buradaki yanıtların çoğu) .... aslında yukarıdakilerin değiştiğini doğruladım. diğer "anahtar" ise <add key = "etkinleştirildi" value = "False" />.
granadaCoder

0

Visual Studio 2017'de - IDE kullanarak derlediğinizde - Tüm eksik nuget paketlerini indirecek ve "paketler" klasörüne kaydedilecektir.

Ancak derleme makinesinde msbuild.exe kullanılarak derleme yapıldı. Bu durumda nuget.exe dosyasını indirdim ve yolda kaldım.

Msbuild.exe'yi çalıştırmadan önce her derleme işlemi sırasında. Çalıştırır -> nuget.exe, NAME_OF_SLN_File dosyasını geri yükler (eğer sadece bir .SLN dosyası varsa, o zaman bu parametreyi göz ardı edebilirsiniz)


0

Ayrıca kullanabilirsiniz

Update-Package -reinstall

NuGet paketlerini Visual Studio'daki Paket Yönetim Konsolu'nda geri yüklemek için.


Bu sorunun cevabı değil
TS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.