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, biri toplam, diğeri de ürün döndüren olmak üzere iki uç noktası olan mevcut bir web API'si kullanılır. Ürün yönteminde bu öğreticide düzeltilen bir hata var.

Örnek uygulamayı 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

Not

Ç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 WebApp WebApp 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 adresine http://localhost:<port number>/api/math/sum?a=4&b=5gidin. sonucunu 9görmeniz gerekir.

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

Projeye ekleme dotnet watch

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

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

    <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 Saatli 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
dotnet test dotnet watch test

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

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 ve .css gibi .html statik içerik de dahil olmak üzere izlenen tüm dosyalarda yapılan değişiklikler uygulamanın yeniden oluşturulmasına neden olur.

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.

Not

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

ile değişiklik yapma dotnet watch

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

yönteminin Product toplamını değil ürünü döndürmesi MathController.cs için hata düzeltildi:

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.

Kullanarak testleri çalıştırma dotnet watch

  1. Product geri yöntemini MathController.cs toplamı döndürecek şekilde değiştirin. 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 ü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 özniteliğini Watch="false" dosyadaki bir öğenin tanımına .csproj 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 izleme 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. Şu kodu yürütün:

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 ortam değişkenleri aracılığıyla geçirilebilir dotnet watch . Kullanılabilir değişkenler şunlardır:

Ayar Açıklama
DOTNET_USE_POLLING_FILE_WATCHER "1" veya "true" olarak ayarlanırsa CoreFx dotnet watch FileSystemWatcheryerine 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 runiçinde yapılandırılmış launchSettings.jsonweb launchBrowser 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 gizlenır.

Tarayıcı yenileme

dotnet watch uygulamaya, içerik değiştiğinde tarayıcıyı yenilemesini sağlayan bir betik ekler. Uygulamanın yanıt sıkıştırmayı dotnet watch etkinleştirdiği durumlar gibi bazı senaryolarda 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 düzen dosyasını içerecek _framework/aspnet-browser-refresh.jsşekilde güncelleştirin:

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

ASCII olmayan karakterler

Visual Studio 17.2 ve üzeri .NET SDK 6.0.300 ve ü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 konaklarında bu karakterler bozuk görünebilir. Bozuk 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.