Dosya izleyici kullanarak ASP.NET Core uygulamaları geliştirme

Tarafından Rick Anderson ve Victor Hurdugaci

dotnet watch , kaynak dosyalar değiştiğinde .NET CLI komutu çalıştıran bir araçtır. Örneğin, bir dosya değişikliği derlemeyi, test yürütmeyi veya dağıtımı tetikleyebilir.

Bu öğreticide, toplam ve ürün döndüren iki uç noktası bulunan mevcut bir web API'si kullanılır. Ürün metodunda bir hata var, bu öğreticide düzeltiliyor.

örnek uygulamasını indirin. İki projeden oluşur: WebApp (ASP.NET Core web API'si) ve WebAppTests (web API'sinin birim testleri).

Komut kabuğunda WebApp klasörüne gidin. Aşağıdaki komutu çalıştırın:

dotnet run

Note

Çalıştırılacak bir proje belirtmek için kullanabilirsiniz dotnet run --project <PROJECT> . Örneğin, örnek uygulamanın kökünden çalıştırıldığında dotnet run --project WebAppWebApp projesi de çalıştırılır.

Konsol çıkışı aşağıdakine benzer iletiler gösterir (uygulamanın çalıştığını ve istekleri beklediğini belirtir):

$ dotnet run
Hosting environment: Development
Content root path: C:/Docs/aspnetcore/tutorials/dotnet-watch/sample/WebApp
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Web tarayıcısında http://localhost:<port number>/api/math/sum?a=4&b=5 adresine gidin. 9 sonucunu görmeniz gerekir.

Ürün API'sine (http://localhost:<port number>/api/math/product?a=4&b=5) gidin. Beklediğiniz gibi 9 değil, 20 döndürür. Bu sorun öğreticinin daha sonraki bölümlerinde düzeltilecektir.

Bir projeye dotnet watch ekle

Dosya dotnet watch izleyici aracı , .NET SDK'sının 2.1.300 sürümüne dahildir. .NET SDK'sının önceki bir sürümü kullanılırken aşağıdaki adımlar gereklidir.

  1. Dosyaya Microsoft.DotNet.Watcher.Tools paket başvurusu ekleyin: .csproj

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
    </ItemGroup>
    
  2. Aşağıdaki komutu çalıştırarak Microsoft.DotNet.Watcher.Tools paketini yükleyin:

    dotnet restore
    

kullanarak .NET CLI komutlarını çalıştırma dotnet watch

Herhangi bir .NET CLI komutu ile dotnet watchçalıştırılabilir. Örneğin:

Command Saat ile komut
dotnet run dotnet watch run
dotnet run -f netcoreapp3.1 dotnet watch run -f netcoreapp3.1
dotnet run -f netcoreapp3.1 -- --arg1 dotnet watch run -f netcoreapp3.1 -- --arg1 (bu komut, .NET Core uygulamanızın çalışmasını sağlar, örnek olarak netcoreapp3.1 yapılandırması içindir)
dotnet testi dotnet watch test

dotnet watch run klasöründe komutunu çalıştırın. Konsol çıkışı watch'nin başlatıldığını gösterir.

Bir web uygulamasında çalıştırılırsa dotnet watch run , hazır olduğunda uygulamanın URL'sine gidebilecek bir tarayıcı başlatılır. dotnet watch bunu, uygulamanın konsol çıkışını okuyarak ve tarafından WebHostgörüntülenen hazır iletiyi bekleyerek yapar.

dotnet watch izlenen dosyalarda değişiklik algıladığında tarayıcıyı yeniler. Bunu yapmak için, watch komutu uygulamaya uygulama tarafından oluşturulan HTML yanıtlarını değiştiren bir ara yazılım ekler. Ara yazılım, sayfaya tarayıcıya yenileme talimatı vermenizi sağlayan dotnet watch bir JavaScript betik bloğu ekler. Şu anda .html ve .css gibi statik içerikler de dahil olmak üzere izlenen tüm dosyalarda yapılan değişiklikler, uygulamanın yeniden oluşturulmasına yol açar.

dotnet watch:

  • Yalnızca varsayılan olarak derlemeleri etkileyen dosyaları izler.
  • Ek olarak izlenen dosyalar (yapılandırma aracılığıyla) yine de derlemenin gerçekleşmesiyle sonuçlanır.

Yapılandırma hakkında daha fazla bilgi için bu belgedeki dotnet-watch yapılandırmasına bakın.

Note

İzleneceğiniz bir proje belirtmek için kullanabilirsiniz dotnet watch --project <PROJECT> . Örneğin, örnek uygulamanın kök dizininden dotnet watch --project WebApp run çalıştırmak, WebApp projesini de çalıştırır ve izler.

dotnet watch ile değişiklik yapın

dotnet watch çalıştığından emin olun.

Product yöntemindeki MathController.cs hatasını düzeltin, böylece toplamı değil, ürünü döndürsün.

public static int Product(int a, int b)
{
    return a * b;
}

Dosyayı kaydedin. Konsol çıkışı, bir dosya değişikliği algılandığını dotnet watch ve uygulamayı yeniden başlatıldığını gösterir.

Doğrula http://localhost:<port number>/api/math/product?a=4&b=5 işlevi doğru sonucu verir.

dotnet watch kullanarak testleri çalıştırın

  1. Product yöntemini, MathController.cs toplamı döndürecek şekilde eski haline getirin. Dosyayı kaydedin.

  2. Komut kabuğunda WebAppTests klasörüne gidin.

  3. dotnet restore komutunu çalıştırın.

  4. dotnet watch test'i çalıştırın. Çıktısı bir testin başarısız olduğunu ve izleyicinin dosya değişikliklerini beklediğini gösterir:

    Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
    Test Run Failed.
    
  5. Yöntem kodunu düzelterek Product metodunun ürünü döndürmesini sağlayın. Dosyayı kaydedin.

dotnet watch dosya değişikliğini algılar ve testleri yeniden çalıştırır. Konsol çıkışı, geçirilen testleri gösterir.

İzleyebileceğiniz dosya listesini özelleştirme

Varsayılan olarak, dotnet-watch aşağıdaki glob desenleri ile eşleşen tüm dosyaları izler:

  • **/*.cs
  • *.csproj
  • **/*.resx
  • İçerik dosyaları: wwwroot/**, **/*.config, **/*.json

Dosyayı düzenleyerek .csproj izleme listesine daha fazla öğe eklenebilir. Öğeler tek tek veya glob desenleri kullanılarak belirtilebilir.

<ItemGroup>
    <!-- extends watching group to include *.js files -->
    <Watch Include="**\*.js" Exclude="node_modules\**\*;**\*.js.map;obj\**\*;bin\**\*" />
</ItemGroup>

İzlenecek dosyaları geri çevirme

dotnet-watch varsayılan ayarlarını yoksayacak şekilde yapılandırılabilir. Belirli dosyaları yoksaymak için Watch="false" dosyasındaki bir öğenin tanımına .csproj özniteliğini ekleyin.

<ItemGroup>
    <!-- exclude Generated.cs from dotnet-watch -->
    <Compile Include="Generated.cs" Watch="false" />

    <!-- exclude Strings.resx from dotnet-watch -->
    <EmbeddedResource Include="Strings.resx" Watch="false" />

    <!-- exclude changes in this referenced project -->
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" Watch="false" />
</ItemGroup>
<ItemGroup>
     <!-- Exclude all Content items from being watched. -->
    <Content Update="@(Content)" Watch="false" />
</ItemGroup>

Özel saat projeleri

dotnet-watch C# projeleri ile sınırlı değildir. Farklı senaryoları işlemek için özel izleme projeleri oluşturulabilir. Aşağıdaki proje düzenini göz önünde bulundurun:

  • test/
    • UnitTests/UnitTests.csproj
    • IntegrationTests/IntegrationTests.csproj

Hedef her iki projeyi de izlemekse, her iki projeyi de izlemek üzere yapılandırılmış özel bir proje dosyası oluşturun:

<Project>
    <ItemGroup>
        <TestProjects Include="**\*.csproj" />
        <Watch Include="**\*.cs" />
    </ItemGroup>

    <Target Name="Test">
        <MSBuild Targets="VSTest" Projects="@(TestProjects)" />
    </Target>

    <Import Project="$(MSBuildExtensionsPath)\Microsoft.Common.targets" />
</Project>

Her iki projede de dosya izlemeye başlamak için test klasörüne geçin. Aşağıdaki komutu yürütür:

dotnet watch msbuild /t:Test

VsTest, herhangi bir test projesinde herhangi bir dosya değiştiğinde yürütülür.

dotnet-watch yapılandırması

Bazı yapılandırma seçenekleri, dotnet watch'ye ortam değişkenleri aracılığıyla geçirilebilir. Kullanılabilir değişkenler şunlardır:

Setting Description
DOTNET_USE_POLLING_FILE_WATCHER "1" veya "true" olarak ayarlanırsa CoreFx dotnet watchFileSystemWatcheryerine bir yoklama dosyası izleyicisi kullanır. Ağ paylaşımlarında veya Docker'a bağlı birimlerde dosyaları izlerken kullanılır.
DOTNET_WATCH_SUPPRESS_MSBUILD_INCREMENTALISM Varsayılan olarak, dotnet watch geri yüklemeyi çalıştırma veya her dosya değişikliğinde izlenen dosya kümesini yeniden değerlendirme gibi belirli işlemlerden kaçınarak derlemeyi iyileştirir. "1" veya "true" olarak ayarlanırsa, bu iyileştirmeler devre dışı bırakılır.
DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER dotnet watch run içindeki launchBrowser ile yapılandırılmış web launchSettings.json uygulamaları için tarayıcıları başlatmaya çalışır. "1" veya "true" olarak ayarlanırsa, bu davranış gizlenir.
DOTNET_WATCH_SUPPRESS_BROWSER_REFRESH dotnet watch run dosya değişikliklerini algıladığında tarayıcıları yenilemeye çalışır. "1" veya "true" olarak ayarlanırsa, bu davranış gizlenir. Ayarlanırsa DOTNET_WATCH_SUPPRESS_LAUNCH_BROWSER bu davranış da gizlenir.

Tarayıcı yenileme

dotnet watch uygulamaya, içerik değiştiğinde tarayıcıyı yenilemesini sağlayan bir betik ekler. Belli senaryolar söz konusu olduğunda, örneğin uygulama yanıt sıkıştırmayı etkinleştirdiğinde, dotnet watch betiği ekleyemeyebilir. Geliştirme aşamasındaki bu gibi durumlarda betiği uygulamaya el ile ekleyin. Örneğin, web uygulamasını betiği el ile eklenecek şekilde yapılandırmak için yerleşim dosyasını _framework/aspnet-browser-refresh.js şeklinde güncelleştirin.

@* _Layout.cshtml *@
<environment names="Development">
    <script src="/_framework/aspnetcore-browser-refresh.js"></script>
</environment>

ASCII olmayan karakterler

Visual Studio 17.2 veya üzeri .NET SDK 6.0.300 veya üzerini içerir. .NET SDK ve 6.0.300 sonraki sürümlerinde, dotnet-watch etkin yeniden yükleme oturumu sırasında konsola ASCII olmayan karakterler yayar. Windows conhost gibi bazı konsol barındırıcılarında bu karakterler bozuk bir şekilde görünebilir. Çapraşık karakterleri önlemek için aşağıdaki yaklaşımlardan birini göz önünde bulundurun:

  • Ortam değişkenini DOTNET_WATCH_SUPPRESS_EMOJIS=1 bu değerlerin yayılmalarını engelleyerek yapılandırın.
  • ASCII olmayan karakterlerin işlenmesini destekleyen gibi https://github.com/microsoft/terminalfarklı bir terminale geçin.

Linux'ta dosya izleyici sınırları

dotnet watch Linux'ta veya Docker kapsayıcılarında çalıştırıldığında, inotify örneklerinin sayısı için yapılandırılmış kullanıcı sınırına ulaşıldığını belirten bir hatayla karşılaşabilirsiniz:

The configured user limit (128) on the number of inotify instances has been reached, or the per-process limit on the number of open file descriptors has been reached.

inotify örneği sınırına ulaşıldıysa, fs.inotify.max_user_instances değerini artırın. İşlem open-file-descriptor sınırına ulaştıysa, bunun yerine bu sınırı artırın. fs.inotify.max_user_watches ayrı ayarı, inotify izleme sınırı aşıldığında uygulanır.

Bu sınırları geçici olarak artırmak için aşağıdaki komutları çalıştırın:

sudo sysctl fs.inotify.max_user_instances=524288
sudo sysctl fs.inotify.max_user_watches=524288

Bu değişikliği kalıcı hale getirmek için dosyaya /etc/sysctl.conf aşağıdaki satırları ekleyin:

fs.inotify.max_user_instances=524288
fs.inotify.max_user_watches=524288

Note

Docker kapsayıcıları için bu sınırlar konak işletim sisteminden devralınır. sysctl ayarlarını kapsayıcının içinde değil, ana makinede yapılandırmanız gerekir.