Proyek ini mereferensikan paket NuGet yang hilang di komputer ini


313

Saya memiliki aplikasi ASP.NET MVC5 yang bekerja kemarin dan sekarang saya mendapatkan kesalahan ini ketika saya mencoba membangun:

Proyek ini mereferensikan paket NuGet yang hilang di komputer ini.

Saya telah memeriksa dua opsi yang memungkinkan nuget untuk secara otomatis mengunduh dan menginstal paket yang hilang diperiksa / AKTIF. Saya juga telah mencoba menghapus semua file dalam folder paket dan kemudian mengunduhnya kembali nuget. Juga ketika saya membuka nuget dan mencari pembaruan dikatakan tidak ada yang perlu diinstal. Saya tidak tahu apa lagi yang harus dilakukan untuk bergerak melampaui masalah yang luar biasa menyebalkan ini.


1
Saya juga telah mengaktifkan nuget restore dengan mengklik kanan proyek dan memilih opsi itu. Itu kemudian menambahkan folder nuget dan tiga item dalam folder itu dan tidak melakukan apa pun untuk menyelesaikan masalah. Saya sudah mencoba membangun kembali dan masih mendapatkan kesalahan yang sama di atas.
Austin Harris

Apakah solusi Anda menyertakan folder .nuget dan sudahkah Anda memperbarui NuGet ke versi terbaru? Lihat di sini: stackoverflow.com/questions/18833649/…
David Brabant

Ya, mencobanya dan itu tidak menyelesaikan masalah pesan kesalahan build saya.
Austin Harris

Alasan lain untuk kesalahan ini adalah The operation has timed out.kesalahan. selama membangun. Anda perlu memeriksa log build Anda, atau tab Diagnostics di layar informasi Visual Studio Online Build Failed.
Joshua Drake

Tidak ada solusi yang berfungsi untuk saya. Saya mengunduh dari repo dan paket mengembalikan dalam struktur file yang benar untuk proyek pertama, proyek kedua tidak dapat menemukannya. Memeriksa .csproj menunjukkan bahwa jalur relatif yang benar sedang digunakan, jadi saya bingung untuk mencoba menyelesaikan ini. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Jawaban:


463

Dalam kasus saya, saya harus menghapus yang berikut dari file .csproj:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Bahkan, dalam cuplikan ini Anda dapat melihat dari mana pesan kesalahan berasal.

Saya mengonversi dari Pemulihan Paket Terintegrasi MSBuild ke Pemulihan Paket Otomatis ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )


12
Ini berfungsi untuk saya, tetapi saya hanya perlu menghapus elemen <Target> </Target>. VS [2013] sepertinya mengembalikannya jika saya menghapus elemen <Import> juga.
Robert Taylor

3
Ini sungguh sulit dipercaya. Mengapa Microsoft membuat semuanya begitu sulit?
dimiguel

11
jika ini bisa dihilangkan, mengapa itu ada di tempat pertama?
OK999

1
OK9999, pada satu titik, Anda harus mengaktifkannya dari versi Visual Studio sebelumnya, dengan mengklik kanan pada solusi dan memilih "Aktifkan pengembalian paket NuGet" yang melakukannya dengan cara lama. Kami tidak membutuhkan itu lagi
Loren Paulsen

3
Saya suka solusi yang hanya melibatkan menghapus hal-hal.
Todd Menier

86

Salah satu solusinya adalah dengan menghapus dari file .csproj berikut ini:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Bagaimana?

  1. Klik kanan pada proyek. Bongkar Proyek.
  2. Klik kanan pada proyek. Edit csproj.
  3. Hapus bagian dari file. Menyimpan.
  4. Klik kanan pada proyek. Muat Ulang Proyek.

Ketika Anda memindahkan proyek dari satu tempat ke tempat lain, ini bekerja dengan baik.
Dean Seo

4
@IvanSantiago Sudah dijawab di atas dengan solusi yang sama! .. Pilih BAWAH! ..
Jack

2
@ClintEastwood Jawaban saya menjelaskan BAGAIMANA melakukannya. Itulah bedanya. Jika seorang pengguna mencari BAGAIMANA jawaban saya memilikinya, berbeda dengan jawaban di atas.
Ivan Santiago

2
@IvanSantiago Anda dapat: menambahkannya sebagai komentar, atau, mengedit jawaban asli dengan Cara.
Colin

50

Dalam kasus saya, ini terjadi setelah saya memindahkan folder solusi dari satu lokasi ke lokasi lain, mengaturnya kembali sedikit dan dalam prosesnya struktur folder relatifnya berubah.

Jadi saya harus mengedit semua entri yang mirip dengan yang berikut di .csprojfile saya dari

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

untuk

  <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

(Catat perubahan dari ..\packages\menjadi packages\. Mungkin struktur relatif yang berbeda dalam kasus Anda, tetapi Anda mendapatkan ide.)


3
Masalah serupa .... Saya telah memindahkan file .csproj ke tingkat dalam struktur direktori dan harus berubah dari ".. \ .. \ paket \ ..." ke ".. \ paket \ ...".
tmgirvin

2
Saya memiliki masalah serupa, tetapi sangat aneh. Saya menggunakannya dalam modul subsolution, jadi tidak masalah dalam solusi itu, tetapi ketika saya mereferensikan solusi itu dari solusi lain, paket-paketnya berada di tempat yang berbeda. Saya mengubah .. \ paket menjadi paket $ (SolutionDir) di seluruh .csproj dan memperbaikinya.
JoeNCA

2
Jika Anda tidak ingin muck sekitar dengan file .csproj secara manual saya telah menemukan bahwa mencatat semua paket nuget yang telah Anda instal untuk proyek ini, menghapusnya dan menginstalnya kembali menyelesaikan masalah ini untuk saya. Saya mencoba untuk menghapus proyek dari solusi untuk dimasukkan ke dalam repositori git sendiri ketika saya mengalami masalah ini.
WiteCastle

apakah ini berarti .csproj Anda berada pada level yang sama dengan file .sln Anda?
Simon_Weaver

@Simon_Tetapi posisi .csprojkerabat Anda terhadap Anda .slntidak masalah dalam konteks ini. Yang penting adalah apakah segala sesuatu yang dirujuk di Anda .csprojtelah pindah ke tempat lain. Jika demikian, maka Anda harus memperbaikinya. Jika Anda memindahkan '.csproj' dengan segala yang dirujuknya tetap utuh, tetapi tetap mempertahankannya .sln, maka Anda harus memperbaiki .slnfile ke lokasi baru .csproj-es, tetapi tidak perlu mengedit .csprojfile.
Nikita G.

22

Saya dengan mudah menyelesaikan masalah ini dengan mengklik kanan pada solusi saya dan kemudian mengklik Aktifkan Pemulihan Paket NuGet pilihan

(PS: Pastikan Anda memiliki Nuget Install From Tools -> Extensions and Update -> Nuget Package Manager untuk Visual Studio 2013. Jika tidak menginstal extention ini terlebih dahulu)

Semoga ini bisa membantu.


7
Ini adalah cara lama untuk mengembalikan paket nuget dan harus dihindari.
The Muffin Man

2
@TheMuffinMan: Bisakah Anda mengklarifikasi apa cara baru itu dan mengapa cara ini harus dihindari (mengingat VS 2013 error output memberitahu Anda untuk melakukan hal itu)?
CantrianBear

2
@CantrianBear Arahkan ke halaman ini docs.nuget.org/consume/package-restore dan temukan bagian yang disebut MSBuild-Integrated Package Restore. Itu adalah cara lama dan daftar beberapa alasan mengapa Anda harus menggunakan cara baru.
The Muffin Man

Lihat blog David Ebbo di blog ini.davidebbo.com/2014/01/ ... Sekarang ... "NuGet sekarang selalu mengembalikan paket sebelum membangun di VS."
timB33

17

Dalam kasus saya itu ada hubungannya dengan versi Microsoft.Build.Bcl. Versi paket nuget saya adalah 1.0.21, tetapi file proyek saya masih menunjuk ke versi 1.0.14

Jadi saya mengubah file .csproj saya dari:

  <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
   <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

untuk:

 <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />

Dan bangunan itu bekerja lagi.


11

Jika Anda menggunakan TFS

Hapus NuGet.exedan NuGet.targetsfile dari .nugetfolder solusi . Pastikan file itu sendiri juga dihapus dari ruang kerja solusi. Simpan NuGet.Configfile untuk terus memotong menambahkan paket ke kontrol sumber.

Edit setiap file proyek (misalnya, .csproj, .vbproj) dalam solusi dan hapus semua referensi ke NuGet.targetsfile tersebut. Buka file proyek di editor pilihan Anda dan hapus pengaturan berikut:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Jika Anda tidak menggunakan TFS

Hapus .nugetfolder dari solusi Anda. Pastikan folder itu sendiri juga dihapus dari ruang kerja solusi.

Edit setiap file proyek (misalnya, .csproj, .vbproj) dalam solusi dan hapus semua referensi ke NuGet.targetsfile tersebut. Buka file proyek di editor pilihan Anda dan hapus pengaturan berikut:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Referensi: Memigrasi solusi MSBuild-Integrated untuk menggunakan Pemulihan Paket Otomatis


8

Apakah mungkin paket-paket tersebut telah dikembalikan ke folder yang salah? Pastikan jalur di file csproj sudah benar.

Jika mereka berbeda itu bisa disebabkan oleh paket yang sekarang sedang dikembalikan ke lokasi yang berbeda. Ini bisa disebabkan oleh file NuGet.Config sedang diperiksa dalam menentukan node seperti ini:

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

Paket-paket sedang dipulihkan, oleh proyek masih mencari di lokasi lama.


1
Saya percaya itu bisa menjadi masalah jalur karena saya memang memindahkan lokasi file tetapi saya tidak melihat di mana ada jalur kode keras di mana saja. Saya melihat dalam file proj dan semua file paket tampaknya relatif seperti ini: <Referensi Sertakan = "Antlr3.Runtime, Versi = 3.5.0.2, Budaya = netral, PublicKeyToken = eb42632606e9261f, processorArchitecture = MSIL"> <SpecificVersion> False </SpecificVersion> <HintPath> .. \ package \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </HintPath> </Reference>
Austin Harris

menambahkan ini ke web.config tidak membantu: <add key = "repositoryPath" value = ".. \ .. \ Packages" />
Austin Harris

Anda tidak ingin menambahkan itu ke web.config. Saya merujuk ke file NuGet.config dan Anda ingin memeriksa jalur relatifnya. Di mana paket Anda relatif terhadap file csproj? Apakah sudah masuk .. \ paket? Sepertinya paket sedang dipulihkan dengan benar, tetapi proyek Anda mencari di tempat yang salah.
infojolt

6

Saya memiliki masalah yang sama. Dalam kasus saya menginstal paket Microsoft.Bcl.Build memperbaiki masalah.


Ini juga bekerja untuk saya - tetapi saya tidak tahu apakah hal yang benar untuk dilakukan adalah menginstal paket itu (yang memiliki efek yang sama dengan perubahan versi versi henkie14 di bawah atau hanya menghapus semua Target itu - apakah mereka benar-benar melakukan sesuatu yang bermanfaat?
Gaz

Dalam 1.0.21versi tidak ada file dalam paket, instalasi 1.0.14versi memperbaiki ini.
FLCL

4

Dihapus di bawah baris dalam file .csproj

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" 
Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
 <ErrorText>This project references NuGet package(s) that are missing on this computer. 
 Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" 
Text="$([System.String]::Format('$(ErrorText)', 
'$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

3

Salah satu solusinya adalah dengan menghapus dari file .csproj berikut ini:

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

Proyek ini mereferensikan paket NuGet yang hilang di komputer ini. Aktifkan Pemulihan Paket NuGet untuk mengunduhnya. Untuk informasi lebih lanjut, lihat http://go.microsoft.com/fwlink/?LinkID=322105 . File yang hilang adalah {0}.


1

Ini adalah langkah-langkah yang saya gunakan untuk memperbaiki masalah:

Untuk menambahkan paket nuget ke solusi Anda:

  1. Klik kanan pada proyek (bukan solusi) yang ingin Anda referensi paket nuget.
  2. Pilih: Kelola paket nuget
  3. Di jendela sembulan, di sebelah kiri Anda memiliki tiga pilihan. Jika Anda memilih Online> Microsoft & .NET , Anda akan dapat menginstal pengelompokan paket ASP.NET Web API 2.2 Microsoft (atau paket apa pun yang Anda butuhkan - milik saya adalah ini).
  4. Sekarang klik kanan pada solusi Anda (bukan proyek) dan pilih Aktifkan pemulihan paket nuget . Ini akan menyebabkan paket-paket diunduh secara otomatis pada saat kompilasi.

Yang harus saya lakukan adalah mengaktifkan paket nugget restore untuk solusinya. Rupanya segalanya sudah diatur dengan benar.
schmiddy98

1

Bagi saya ini berhasil karena saya baru saja menyalin folder .nuget dari solusi yang sudah ada ke solusi yang ada, dan mereferensikan isinya!


1

Hal pertama yang harus dicoba adalah klik kanan solusi dan pilih "Kembalikan Paket Nuget".

Dalam kasus saya yang tidak berhasil, jadi saya mengikuti beberapa rekomendasi untuk menghapus "Impor" dan "Target" pada file proyek, ini bekerja untuk 2 dari 3 proyek saya, tetapi mendapat kesalahan yang berbeda pada yang terakhir.

Apa yang berhasil adalah membuka Package Manager Console dan menjalankan:

Update-Package -reinstall -ProjectName MyProjectName

Dibutuhkan waktu tetapi karena menginstal ulang semua paket proyek Anda akan dikompilasi tanpa masalah


1

Saya memiliki masalah yang sama. Saya menemukannya ketika saya menyalin proyek yang ada dan mentransfernya pada folder direktori solusi saya dan menambahkannya sebagai proyek yang ada ke solusi kosong saya. Jadi saya harus mengedit file csproj saya dan mencari baris kode khusus ini, sebagian besar waktu, ini dapat ditemukan pada baris terakhir:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Setelah baris itu, saya harus berkomentar:

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <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('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" />
  </Target>
  <Import Project="..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" />

Solusi Anda akan meminta ada perubahan pada proyek Anda, cukup pilih Muat Ulang Semua:

masukkan deskripsi gambar di sini Kemudian semuanya bekerja dengan baik setelah membangun kembali solusi saya.


0

Saya memiliki masalah yang sama ketika saya merujuk perpustakaan Kelas ke dalam aplikasi web MVC saya,

Masalahnya adalah ketidakcocokan nomor versi paket nuget antara dua proyek.

mis: perpustakaan kelas saya memiliki log4net 1.2.3 tetapi webapp saya 1.2.6

memperbaiki: pastikan kedua proyek memiliki nomor versi yang sama direferensikan.


0

Mengedit .sln dan .csproj tidak selalu mudah atau diinginkan. Setelah Anda mendapatkan daftar kesalahan Anda dapat melihat proyek apa yang memiliki paket yang hilang (juga, simpul Referensi biasanya menunjukkan bahwa ada rakitan yang hilang kecuali paket adalah kode sumber, sumber daya, gambar, atau hanya yang berbasis teks).

Menghapus dan kemudian menambahkan paket bukanlah ide yang bagus kecuali Anda menggunakan versi terbaru dari paket. Kalau tidak bersiaplah untuk kejutan, tidak selalu menyenangkan.

Jika, katakanlah, paketnya adalah EntityFramework maka dari galeri NuGet Anda mendapatkan versi terbaru yang pada saat menulis komentar ini adalah 6.1.3 .

Jadi, mungkin cara teraman untuk menangani situasi ini adalah mengembalikan paket yang hilang satu per satu. Ya, sedikit latihan yang menyakitkan tetapi mengejar bug yang halus karena versi paket yang berbeda mungkin jauh lebih tidak menyenangkan.

Setelah ini dikatakan, dan biarkan lagi EntityFramework menjadi paket yang hilang, Anda bisa mengeluarkan perintah berikut di Package-Manager Console:

PM> Install-Package EntityFramework -Version 6.0.1 

Ini akan menginstal versi yang benar, yaitu 6.0.1 , yaitu versi yang ditentukan dalam paket.config:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.0.1" targetFramework="net451" />
    </packages>

0

Saya mengalami ini ketika file csproj dan sln berada di folder yang sama (bodoh, saya tahu). Setelah saya pindah ke file sln ke folder di atas folder csproj saya jadi


-1

Saya membuat folder bernama '.nuget' di folder solusi root Kemudian menambahkan file 'NuGet.Config' di folder ini dengan konten berikut

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
 <add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>

Kemudian buat file '.nuGet.targets' seperti di bawah $ (MSBuildProjectDirectory) .. \

    <!-- Enable the restore command to run before builds -->
    <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>

    <!-- Property that enables building a package from a project -->
    <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>

    <!-- Determines if package restore consent is required to restore packages -->
    <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

    <!-- Download NuGet.exe if it does not already exist -->
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
    <!--
        <PackageSource Include="https://nuget.org/api/v2/" />
        <PackageSource Include="https://my-nuget-source/nuget/" />
    -->
</ItemGroup>

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <!-- Windows specific commands -->
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
    <PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>

<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
    <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
    <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
    <PackagesConfig>packages.config</PackagesConfig>
    <PackagesDir>$(SolutionDir)packages</PackagesDir>
</PropertyGroup>

<PropertyGroup>
    <!-- NuGet command -->
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
    <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>

    <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
    <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>

    <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>

    <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
    <!-- Commands -->
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch) -o "$(PackagesDir)"</RestoreCommand>
    <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols</BuildCommand>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(RestorePackages) == 'true'">
        RestorePackages;
        $(BuildDependsOn);
    </BuildDependsOn>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(BuildPackage) == 'true'">
        $(BuildDependsOn);
        BuildPackage;
    </BuildDependsOn>
</PropertyGroup>

<Target Name="CheckPrerequisites">
    <!-- Raise an error if we're unable to locate nuget.exe  -->
    <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
    <SetEnvironmentVariable EnvKey="VisualStudioVersion" EnvValue="$(VisualStudioVersion)" Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' " />
    <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')"  />
</Target>

<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(RestoreCommand)"
          Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

    <Exec Command="$(RestoreCommand)"
          LogStandardErrorAsError="true"
          Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>

<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(BuildCommand)" 
          Condition=" '$(OS)' != 'Windows_NT' " />

    <Exec Command="$(BuildCommand)"
          LogStandardErrorAsError="true"
          Condition=" '$(OS)' == 'Windows_NT' " />
</Target>

<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <OutputFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Core" />
        <Using Namespace="System" />
        <Using Namespace="System.IO" />
        <Using Namespace="System.Net" />
        <Using Namespace="Microsoft.Build.Framework" />
        <Using Namespace="Microsoft.Build.Utilities" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                OutputFilename = Path.GetFullPath(OutputFilename);

                Log.LogMessage("Downloading latest version of NuGet.exe...");
                WebClient webClient = new WebClient();
                webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

                return true;
            }
            catch (Exception ex) {
                Log.LogErrorFromException(ex);
                return false;
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

 <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <EnvKey ParameterType="System.String" Required="true" />
        <EnvValue ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process);
            }
            catch  {
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.