Menyiapkan pemulihan paket dengan Team Foundation Build
Artikel ini menyediakan panduan terperinci tentang cara memulihkan paket sebagai bagian dari Team Services Build keduanya, untuk Kontrol Versi Git dan Team Services.
Meskipun panduan ini khusus untuk skenario penggunaan Visual Studio Team Services, konsep ini juga berlaku untuk kontrol versi dan sistem build lainnya.
Berlaku untuk:
- Proyek MSBuild kustom yang berjalan pada versi TFS apa pun
- Team Foundation Server 2012 atau yang lebih lama
- Templat Proses Build Team Foundation Kustom yang dimigrasikan ke TFS 2013 atau yang lebih baru
- Templat Proses Build Dengan fungsionalitas Pemulihan Nuget dihapus
Jika Anda menggunakan Visual Studio Team Services atau Team Foundation Server 2013 dengan templat proses build-nya, pemulihan paket otomatis terjadi sebagai bagian dari proses build.
Pendekatan umum
Keuntungan menggunakan NuGet adalah Anda dapat menggunakannya untuk menghindari pemeriksaan biner ke sistem kontrol versi Anda.
Ini sangat menarik jika Anda menggunakan sistem kontrol versi terdistribusi seperti git karena pengembang perlu mengkloning seluruh repositori, termasuk riwayat lengkap, sebelum mereka dapat mulai bekerja secara lokal. Memeriksa biner dapat menyebabkan kembung repositori yang signifikan karena file biner biasanya disimpan tanpa kompresi delta.
NuGet telah mendukung pemulihan paket sebagai bagian dari build untuk waktu yang lama sekarang. Implementasi sebelumnya memiliki masalah ayam dan telur untuk paket yang ingin memperpanjang proses build karena paket yang dipulihkan NuGet saat membangun proyek. Namun, MSBuild tidak mengizinkan perluasan build selama build; seseorang bisa berpendapat bahwa ini adalah masalah di MSBuild tetapi saya akan berpendapat bahwa ini adalah masalah yang melekat. Tergantung pada aspek mana yang perlu Anda perpanjang mungkin terlambat untuk mendaftar pada saat paket Anda dipulihkan.
Penyembuhan untuk masalah ini adalah memastikan bahwa paket dipulihkan sebagai langkah pertama dalam proses build:
nuget restore path\to\solution.sln
Saat proses build Memulihkan paket sebelum membuat kode, Anda tidak perlu melakukan check-in .targets
file
Catatan
Paket harus ditulis untuk memungkinkan pemuatan di Visual Studio. Jika tidak, Anda mungkin masih ingin memeriksa .targets
file sehingga pengembang lain cukup membuka solusi tanpa harus memulihkan paket terlebih dahulu.
Proyek demo berikut menunjukkan cara menyiapkan build sedih sehingga packages
folder dan .targets
file tidak perlu diperiksa. Ini juga menunjukkan cara menyiapkan build otomatis pada Team Foundation Service untuk proyek sampel ini.
Struktur repositori
Proyek demo kami adalah alat baris perintah sederhana yang menggunakan argumen baris perintah untuk mengkueri Bing. Ini menargetkan .NET Framework 4 dan menggunakan banyak paket BCL (Microsoft.Net.Http, Microsoft.Bcl, Microsoft.Bcl.Async, dan Microsoft.Bcl.Build).
Struktur repositori terlihat sebagai berikut:
<Project>
│ .gitignore
│ .tfignore
│ build.proj
│
├───src
│ │ BingSearcher.sln
│ │
│ └───BingSearcher
│ │ App.config
│ │ BingSearcher.csproj
│ │ packages.config
│ │ Program.cs
│ │
│ └───Properties
│ AssemblyInfo.cs
│
└───tools
└───NuGet
nuget.exe
Anda dapat melihat bahwa kami belum memeriksa packages
folder atau file apa pun .targets
.
Namun, kami telah memeriksa nuget.exe
apa yang diperlukan selama build. Mengikuti konvensi yang banyak digunakan, kami telah memeriksanya di bawah folder bersama tools
.
Kode sumber berada di src
bawah folder . Meskipun demo kami hanya menggunakan satu solusi, Anda dapat dengan mudah membayangkan bahwa folder ini berisi lebih dari satu solusi.
Abaikan file
Catatan
Saat [known bug in the NuGet client](https://nuget.codeplex.com/workitem/4072)
ini ada yang menyebabkan klien masih menambahkan folder ke packages
kontrol versi. Solusinya adalah menonaktifkan integrasi kontrol sumber. Untuk melakukannya, Anda memerlukan Nuget.Config
file di .nuget
folder yang sejajar dengan solusi Anda. Jika folder ini belum ada, Anda perlu membuatnya. Di Nuget.Config
, tambahkan konten berikut:
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>
Untuk berkomunikasi dengan kontrol versi yang tidak berniat untuk memeriksa folder paket , kami juga telah menambahkan file abaikan untuk git (.gitignore
) serta kontrol versi TF (.tfignore
). File-file ini menjelaskan pola file yang tidak ingin Anda check-in.
File .gitignore
terlihat sebagai berikut:
syntax: glob
*.user
*.suo
bin
obj
packages
*.nupkg
project.lock.json
project.assets.json
File .gitignore
ini cukup kuat. Misalnya, jika Anda ingin umumnya tidak check-in konten packages
folder tetapi ingin menggunakan panduan sebelumnya untuk memeriksa file, .targets
Anda bisa memiliki aturan berikut:
packages
!packages/**/*.targets
Ini akan mengecualikan semua packages
folder tetapi akan menyertakan kembali semua file yang terkandung .targets
. Ngomong-ngomong, Anda dapat menemukan templat untuk .gitignore
file yang khusus disesuaikan untuk kebutuhan pengembang Visual Studio di sini.
Kontrol versi TF mendukung mekanisme yang sangat mirip melalui file .tfignore . Sintaksnya hampir sama:
*.user
*.suo
bin
obj
packages
*.nupkg
project.lock.json
project.assets.json
build.proj
Untuk demo kami, kami menjaga proses build cukup sederhana. Kami akan membuat proyek MSBuild yang membangun semua solusi sambil memastikan bahwa paket dipulihkan sebelum membangun solusi.
Proyek ini akan memiliki tiga target Clean
konvensional , Build
dan Rebuild
serta target RestorePackages
baru .
- Target
Build
danRebuild
keduanya bergantung padaRestorePackages
. Ini memastikan bahwa Anda dapat menjalankanBuild
danRebuild
dan mengandalkan paket yang dipulihkan. Clean
,Build
danRebuild
panggil target MSBuild yang sesuai pada semua file solusi.- Target
RestorePackages
memanggilnuget.exe
untuk setiap file solusi. Ini dicapai dengan menggunakan fungsionalitas batching MSBuild.
Hasilnya terlihat sebagai berikut:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutDir Condition=" '$(OutDir)'=='' ">$(MSBuildThisFileDirectory)bin\</OutDir>
<Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration>
<SourceHome Condition=" '$(SourceHome)'=='' ">$(MSBuildThisFileDirectory)src\</SourceHome>
<ToolsHome Condition=" '$(ToolsHome)'=='' ">$(MSBuildThisFileDirectory)tools\</ToolsHome>
</PropertyGroup>
<ItemGroup>
<Solution Include="$(SourceHome)*.sln">
<AdditionalProperties>OutDir=$(OutDir);Configuration=$(Configuration)</AdditionalProperties>
</Solution>
</ItemGroup>
<Target Name="RestorePackages">
<Exec Command=""$(ToolsHome)NuGet\nuget.exe" restore "%(Solution.Identity)"" />
</Target>
<Target Name="Clean">
<MSBuild Targets="Clean"
Projects="@(Solution)" />
</Target>
<Target Name="Build" DependsOnTargets="RestorePackages">
<MSBuild Targets="Build"
Projects="@(Solution)" />
</Target>
<Target Name="Rebuild" DependsOnTargets="RestorePackages">
<MSBuild Targets="Rebuild"
Projects="@(Solution)" />
</Target>
</Project>
Mengonfigurasi Team Build
Team Build menawarkan berbagai templat proses. Untuk demonstrasi ini, kami menggunakan Team Foundation Service. Penginstalan TFS lokal akan sangat mirip.
Kontrol Versi Git dan TF memiliki templat Team Build yang berbeda, sehingga langkah-langkah berikut akan bervariasi tergantung pada sistem kontrol versi mana yang Anda gunakan. Dalam kedua kasus, yang Anda butuhkan adalah memilih build.proj sebagai proyek yang ingin Anda bangun.
Pertama, mari kita lihat templat proses untuk git. Dalam templat berbasis git, build dipilih melalui properti Solution to build
:
Harap dicatat bahwa properti ini adalah lokasi di repositori Anda. Karena kami build.proj
berada di akar, kami hanya menggunakan build.proj
. Jika Anda menempatkan file build di bawah folder bernama tools
, nilainya adalah tools\build.proj
.
Dalam templat kontrol versi TF, proyek dipilih melalui properti Projects
:
Berbeda dengan templat berbasis git, kontrol versi TF mendukung pemilih (tombol di sisi kanan dengan tiga titik). Jadi untuk menghindari kesalahan pengetikan, kami sarankan Anda menggunakannya untuk memilih proyek.