Aracılığıyla paylaş


MSBuild sorunlarını gidermek ve günlükler oluşturmak

Aşağıdaki yordamlar Visual Studio projenizdeki derleme sorunlarını tanılamanıza ve gerekirse araştırma için Microsoft'a göndermek üzere bir günlük oluşturmanıza yardımcı olabilir.

Özellik değeri yok sayıldı

Bir proje özelliği belirli bir değere ayarlanmış olarak görünüyorsa ancak özelliğin derleme üzerinde hiçbir etkisi yoksa şu adımları izleyin:

  1. Visual Studio sürümünüze karşılık gelen Visual Studio Geliştirici Komut İstemi'ni açın.

  2. Çözüm yolunuz, yapılandırmanız ve proje adınızın değerlerini değiştirdikten sonra aşağıdaki komutu çalıştırın:

    MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
    

    Bu komut bir "önceden işlenmiş" MSBuild proje dosyası (out.xml) oluşturur. Tanımlandığı yeri görmek için bu dosyada belirli bir özelliği arayabilirsiniz.

Bir özelliğin son tanımı, derlemenin ne tükettiğidir. Özellik iki kez ayarlanırsa, ikinci değer ilk değerin üzerine yazar. Ayrıca, MSBuild projeyi birkaç geçişte değerlendirir:

  • PropertyGroups ve Importlar
  • Öğe Tanım Grupları
  • ItemGroups
  • Targets

Bu nedenle, aşağıdaki sıra verilmiştir:

<PropertyGroup>
   <MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
   <MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
  <MyItems>
      <MyMetadata>$(MyProperty)</MyMetadata>
  </MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
   <MyProperty>B</MyProperty>
</PropertyGroup>

MyFile.txt öğesinin MyMetadata değeri, derleme sırasında B olarak değerlendirilir ve bu değer boş ya da A değildir.

Artımlı derleme olması gerekenden daha fazlasını oluşturuyor

MSBuild gereksiz yere bir projeyi veya proje öğesini yeniden oluşturuyorsa, ayrıntılı veya ikili derleme günlüğü oluşturun. Günlükte gereksiz yere oluşturulmuş ya da derlenmiş dosyaları arayın. Çıktı şuna benzer:

  Task "CL"

  Using cached input dependency table built from:

  F:\test\Project1\Project1\Debug\Project1.tlog\CL.read.1.tlog

  Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
  F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
  Project1.cpp will be compiled because F:\TEST\PROJECT1\PROJECT1\PROJECT1.H was modified at 6/5/2019 12:37:09 PM.

  Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
  F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ

  Write Tracking Logs:
  Debug\Project1.tlog\CL.write.1.tlog

Visual Studio IDE'de (ayrıntılı çıktı penceresi ayrıntısıyla) derliyorsanız, Çıkış Penceresi her projenin güncel olmama nedenini görüntüler.

1>------ Up-To-Date check: Project: Project1, Configuration: Debug Win32 ------

1>Project is not up-to-date: build input 'f:\test\project1\project1\project1.h' was modified after the last build finished.

Ayrıntılı günlük oluşturma

  1. Araçlar>Seçenekleri bölmesini açın ve Tüm Ayarlar>Projeleri ve Çözümleri>Derleme ve Çalıştırma bölümünü genişletin.
  1. Araçlar>Seçenekleri iletişim kutusunu açın ve Projeler ve Çözümler>Derleme ve Çalıştırma bölümünü genişletin.
  1. Açılan listeleri kullanın ve hem MSBuild projesi derleme çıkışı ayrıntı düzeyini hem de MSBuild projesi derleme günlük dosyası ayrıntı seçeneklerini Ayrıntılı olarak ayarlayın.

    İlki Çıkış Penceresinde derleme ayrıntı düzeyini, ikincisi ise derleme sırasında her projenin ara dizininde {projectname}.log oluşturulan dosyada derleme ayrıntı düzeyini denetler.

  2. Visual Studio geliştirici komut isteminde, gerçek yolunuzu ve yapılandırma değerlerinizi değiştirerek şu komutlardan birini girin:

    MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
    

    veya

    MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
    

    MSBuild'i çalıştırdığınız dizinde bir MSBuild.log dosya oluşturulur.

Araştırma için MSBuild ikili günlük dosyalarını sağlayın

MSBuild ayrıntılı bir ikili günlük dosyası yakalama özelliğine sahiptir. Oluşturma sorunu yaşıyorsanız ve ikili günlük sağlayabiliyorsanız, günlük sorunu araştırmak için yararlı olabilir.

Ancak, istemeden istediğinizden daha fazla bilgi paylaşmadığınızdan emin olmak için ikili günlükte ne tür bilgilerin yakalandığını bilmeniz gerekir. İkili günlük, derlemenizin yaptığı hemen hemen her şeyi yakalar; proje dosyalarınızın ve örneğin .props ve .targets gibi içe aktardıkları dosyaların içerikleri, derleme sırasında çalıştırılan tüm görevler, giriş ve çıkışların yanı sıra bu MSBuild oturumunda erişilen ortam değişkenlerini de içerir. Genellikle derlenen kaynak dosyaların içeriğini içermez, ancak tam adlarını ve yollarını yakalar.

Uyarı

Bazı derleme ortamları, ortam değişkenlerini kullanarak gizli bilgileri erişilebilir hale getirir. İkili günlük paylaşmadan önce, API belirteçlerini veya diğer önemli gizli bilgileri açığa çıkarmadığından emin olun.

Komut satırı derlemeleri için ikili günlükleri kayıt altına alma

MSBuild'e -bl parametresini (MSBuild.exe veya dotnet build) geçirerek bir ikili günlük dosyası oluşturabilirsiniz. Oluşturulan .binlog dosyanın içeriğini MSBuild Yapılandırılmış Günlük Görüntüleyicisi'ni kullanarak veya Tarayıcınızda Canlı Yapılandırılmış Günlük Görüntüleyicisi'ni kullanarak inceleyebilirsiniz. MSBuild, tarayıcınızda görüntülenen ikili günlüklerden veri yakalamaz.

Örnekler

dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release

Ayrıca, ikili günlükler hakkında daha fazla ayrıntıya bakın.

Visual Studio aracılığıyla binary günlükleri yakalama

Tüm MSBuild çağrılarının günlüklerini yakalamak için:

MSBUILDDEBUGENGINE ortam değişkenini '1' olarak ayarlayın ve (isteğe bağlı olarak), yakalanan günlükleri depolamak için mevcut bir hedef klasöre MSBUILDDEBUGPATH ayarlayın. Ardından ortamı devralmak için Visual Studio'yu aynı kabuktan başlatın:

SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln

MSBuild ikili günlükleri, ortam değişkeni aracılığıyla MSBUILDDEBUGPATH belirtilen bir konuma kaydedilir (veya geçerli bir klasörün MSBuild_Logs alt klasörüne ya da erişim haklarına bağlı olarak %temp% alt klasörüne varsayılan olarak kaydedilir).

Uyarı

Günlükler her MSBuild çağrısı (tasarım zamanı derlemeleri dahil) için kaydedilir ve eskilerini kaldırmadan klasörde tutulur; böylece günlük dosyalarının sayısı hızla artabilir. Kabul ortam değişkeninin yalnızca sorunun yeniden üretilmesi için kısa bir süre için ayarlanması önerilir (ancak bazı belirsiz sorunların birden çok yeniden oluşturma denemesine ihtiyaç duyabileceği anlaşılabilir).

Project System Tools uzantısını kullanarak ikili MSBuild günlüğü oluşturma

Visual Studio aracılığıyla binlogları yakalamak için Project System Tools deposundaki bu kılavuza bakın.

  1. Project System Tools uzantısını indirin ve yükleyin.

  2. Uzantı yüklendikten sonra, Diğer Windows'u> menüsünde bazı yeni öğeler görünür.

    Diğer Windows menüsü

  3. Visual Studio'da Derleme Günlüğü penceresini göstermek için Görüntüle>Diğer Pencereler>Derleme Günlüğü'nü seçin. Proje sisteminde hem normal hem de tasarım zamanı derlemelerini kaydetmeye başlamak için ilk araç çubuğu simgesini seçin.

    Derleme günlüğü penceresi

  4. Bir yapı kaydedildikten sonra Yapı Günlüğü penceresinde görüntülenir. Öğeye sağ tıklayın ve bağlam menüsünde Günlükleri Kaydet'i seçerek dosyanızı .binlog kaydedin.

    Derleme günlüğü bağlam menüsü

MSBuild Yapılandırılmış Günlük Görüntüleyicisi'ni kullanarak .binlog dosyalarınızı görüntüleyebilir ve arayabilirsiniz.