Bagikan melalui


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 Cleankonvensional , Build dan Rebuild serta target RestorePackagesbaru .

  • Target Build dan Rebuild keduanya bergantung pada RestorePackages. Ini memastikan bahwa Anda dapat menjalankan Build dan Rebuild dan mengandalkan paket yang dipulihkan.
  • Clean, Build dan Rebuild panggil target MSBuild yang sesuai pada semua file solusi.
  • Target RestorePackages memanggil nuget.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="&quot;$(ToolsHome)NuGet\nuget.exe&quot; restore &quot;%(Solution.Identity)&quot;" />
    </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:

Build Process for git

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:

Build Process for TFVC

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.