Bagikan melalui


.vcxproj file dan kartubebas

IDE Visual Studio tidak mendukung konstruksi tertentu dalam item proyek dalam .vcxproj file. Konstruksi yang tidak didukung ini mencakup wildcard, daftar yang dibatasi titik koma, atau makro MSBuild yang meluas ke beberapa file. Sistem .vcxproj proyek untuk build C++ lebih ketat daripada MSBuild. Setiap item proyek diperlukan untuk memiliki item MSBuild sendiri. Untuk informasi selengkapnya tentang .vcxproj format file, lihat .vcxproj dan .props struktur file.

Contoh konstruksi ini tidak didukung oleh IDE:

<ItemGroup>
  <None Include="*.txt">
  <ClCompile Include="a.cpp;b.cpp"/>
  <ClCompile Include="@(SomeItems)" />
</ItemGroup>

.vcxproj Jika file proyek yang menyertakan konstruksi ini dimuat dalam IDE, proyek mungkin tampaknya berfungsi pada awalnya. Namun, masalah kemungkinan segera setelah proyek dimodifikasi oleh Visual Studio lalu disimpan di disk. Anda mungkin mengalami crash acak dan perilaku yang tidak ditentukan.

Di Visual Studio 2019 versi 16.7, saat Visual Studio memuat .vcxproj file proyek, visual Studio secara otomatis mendeteksi entri yang tidak didukung dalam item proyek. Anda akan melihat peringatan di jendela Output selama beban solusi.

Visual Studio 2019 versi 16.7 juga menambahkan dukungan proyek baca-saja. Dukungan baca-saja memungkinkan IDE untuk menggunakan proyek yang ditulis secara manual yang tidak memiliki batasan tambahan proyek yang dapat diedit IDE.

Jika Anda memiliki .vcxproj file yang menggunakan satu atau beberapa konstruksi yang tidak didukung, Anda dapat membuatnya dimuat tanpa peringatan di IDE dengan menggunakan salah satu opsi ini:

  • Mencantumkan semua item secara eksplisit
  • Tandai proyek Anda sebagai baca-saja
  • Memindahkan item kartubebas ke isi target

Mencantumkan semua item secara eksplisit

Saat ini, tidak ada cara untuk membuat item ekspansi kartubebas terlihat di jendela Penjelajah Solusi dalam proyek non-baca-saja. Penjelajah Solusi mengharapkan proyek untuk mencantumkan semua item secara eksplisit.

Untuk membuat .vcxproj proyek secara otomatis memperluas kartubebas di Visual Studio 2019 versi 16.7 atau yang lebih baru, atur properti ke trueReplaceWildcardsInProjectItems . Kami sarankan Anda membuat Directory.Build.props file di direktori akar, dan menggunakan konten ini:

<Project>
  <PropertyGroup>
    <ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
  </PropertyGroup>
</Project>

Tandai proyek Anda sebagai baca-saja

Di Visual Studio 2019 versi 16.7 dan yang lebih baru, Anda dapat menandai proyek sebagai baca-saja. Untuk menandai proyek Anda baca-saja, tambahkan properti berikut ke file Anda .vcxproj , atau ke salah satu file yang diimpornya:

<PropertyGroup>
    <ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>

Pengaturan mencegah <ReadOnlyProject> Visual Studio mengedit dan menyimpan proyek, sehingga Anda dapat menggunakan konstruksi MSBuild apa pun di dalamnya, termasuk kartubebas.

Penting untuk diketahui bahwa cache proyek tidak tersedia jika Visual Studio mendeteksi kartubebas dalam item proyek dalam .vcxproj file atau salah satu impornya. Waktu pemuatan solusi dalam IDE jauh lebih lama jika Anda memiliki banyak proyek yang menggunakan kartubebas.

Memindahkan item kartubebas ke isi target

Anda mungkin ingin menggunakan kartubebas untuk mengumpulkan sumber daya, menambahkan sumber yang dihasilkan, dan sebagainya. Jika Anda tidak memerlukannya tercantum di jendela Penjelajah Solusi, Anda dapat menggunakan prosedur ini sebagai gantinya:

  1. Ubah nama grup item untuk menambahkan kartubebas. Misalnya, alih-alih:

    <Image Include="*.bmp" />
    <ClCompile Include="*.cpp" />
    

    ubah menjadi:

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. Tambahkan isi ini ke file Anda .vcxproj . Atau, tambahkan ke Directory.Build.targets file di direktori akar, untuk memengaruhi semua proyek di bawah akar tersebut:

    <Target Name="AddWildCardItems"
        AfterTargets="BuildGenerateSources">
      <ItemGroup>
        <Image Include="@(_WildCardImage)" />
        <ClCompile Include="@(_WildCardClCompile)" />
      </ItemGroup>
    </Target>
    

    Perubahan ini membuat build melihat item seperti yang ditentukan dalam .vcxproj file. Namun, sekarang tidak terlihat di jendela Penjelajah Solusi, dan tidak akan menyebabkan masalah dalam IDE.

  3. Untuk menampilkan IntelliSense yang benar untuk _WildCardClCompile item saat Anda membuka file tersebut di editor, tambahkan konten berikut:

    <PropertyGroup>
      <ComputeCompileInputsTargets>
        AddWildCardItems
        $(ComputeCompileInputsTargets)
      </ComputeCompileInputsTargets>
    </PropertyGroup>
    

Secara efektif, Anda dapat menggunakan kartubebas untuk item apa pun di dalam isi target. Anda juga dapat menggunakan kartubebas dalam ItemGroup yang tidak didefinisikan sebagai item proyek oleh ProjectSchemaDefinition.

Catatan

Jika Anda memindahkan kartubebas termasuk dari .vcxproj file ke file yang diimpor, kartubebas tersebut tidak akan terlihat di jendela Penjelajah Solusi. Perubahan ini juga memungkinkan proyek Anda untuk memuat ide tanpa modifikasi. Namun, kami tidak merekomendasikan pendekatan ini, karena menonaktifkan cache proyek.

Baca juga

Mengatur properti kompilator dan build C++ di Visual Studio
File XML Halaman Properti