Bagaimana cara mengecualikan folder dari suatu proyek tetapi tidak dari penerbitan?

Saya telah memigrasikan proyek inti asp.net ke VS2017 RC, yang sekarang mendukung kemampuan untuk mengecualikan file dari suatu proyek. Saya telah mengecualikan dua folder, yang menambahkan baris ini ke file csproj saya:

<ItemGroup>
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

Ini berfungsi dengan baik, kecuali sekarang file-file itu tidak dipublikasikan lagi. Bagaimana cara mengecualikan folder-folder ini dari proyek tetapi tetap memasukkannya saat dipublikasikan?


person Eric B    schedule 23.01.2017    source sumber
comment
Menimbulkan pertanyaan, mengapa Anda ingin mereka dikeluarkan dari proyek jika Anda ingin mereka dipublikasikan?   -  person DavidG    schedule 23.01.2017
comment
@DavidG sehingga tidak diambil oleh visual studio, temukan di file, muncul di penjelajah solusi, dll. Itu adalah file javascript/css yang diperkecil dan perpustakaan eksternal.   -  person Eric B    schedule 23.01.2017
comment
Mungkin lebih baik menyembunyikannya saja. Apakah DnxInvisibleFolder masih berfungsi? misalnya: <ItemGroup><DnxInvisibleFolder Include="wwwroot\dist\" /></ItemGroup>. Meskipun saya masih tidak mengerti mengapa Anda peduli untuk tidak menampilkannya di sana.   -  person DavidG    schedule 23.01.2017
comment
Tidak, itu tidak berhasil. Saya peduli karena pencarian Visual Studio dalam file mungkin memerlukan waktu lama dan mengembalikan ratusan hasil untuk string pencarian dari perpustakaan eksternal atau file yang diperkecil.   -  person Eric B    schedule 23.01.2017
comment
Apakah Anda dapat mengklik kanan folder di VS dan menyembunyikannya? Begitulah cara kerjanya sebelumnya.   -  person DavidG    schedule 23.01.2017
comment
Ya, yang menghasilkan baris dalam pertanyaan saya yang juga menghapusnya dari publikasi.   -  person Eric B    schedule 23.01.2017
comment
Di pra-csproj, ada opsi sembunyikan yang berbeda dari hapus   -  person DavidG    schedule 23.01.2017


Jawaban (3)


Item msbuild berikut yang diambil dari templat spa dotnet baru membantu saya mencapai apa yang saya yakini Anda cari:

<ItemGroup>
    <Content Remove="wwwroot\dist\**" />
    <Content Remove="wwwroot\lib\**" />
</ItemGroup>

<Target Name="GiveAName" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm etc etc do your stuff" />
    <Exec Command="or webpack" />

    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
        <DistFiles Include="wwwroot\dist\**; wwwroot\lib\**" />
        <ResolvedFileToPublish Include="@(DistFiles-&gt;'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
            <RelativePath>%(DistFiles.Identity)</RelativePath>
            <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </ResolvedFileToPublish>
    </ItemGroup>
</Target>
person Gonzalo Lucero    schedule 08.06.2017
comment
Saya baru saja mengujinya di VS2017 (v15.3.5) dan berhasil. Terima kasih! Sebagai catatan tambahan, saya menghapus barang npm, karena saya tidak membutuhkannya. - person Judah Gabriel Himango; 03.10.2017
comment
jangan khawatir. FYI Saya juga menghapus perintah npm dan merasa jauh lebih efisien untuk menangani tugas front end di luar VS. - person Gonzalo Lucero; 04.10.2017
comment
Saya mencoba membuatnya berfungsi tetapi untuk direktori build npm di luar proyek .net saya (backend ada dalam satu folder dan selama penerapan, menggabungkan sumber daya UI dari folder kedua). Yaitu file dist saya terlihat seperti ‹DistFiles Include=..\..\src-app\www\dist**; /› Tapi saya kesulitan mengumpulkan keluaran apa pun... saya tidak mengerti sintaksis dari inlcude distfiles -› fullpath ?? apakah ada orang lain yang mencoba struktur folder ini? - person Dale Holborow; 08.12.2017

Saya mengatasinya dengan menambahkan baris berikut ke target PrepublishScript di file csproj, karena sepertinya belum ada cara yang elegan untuk melakukannya.

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
  <!-- Other things here already -->
  <ItemGroup>
    <Lib Include="wwwroot/lib/**;" />
    <Dist Include="wwwroot/dist/**;" />
  </ItemGroup>
  <Copy SourceFiles="@(Lib)" DestinationFolder="$(PublishDir)\wwwroot\lib\%(RecursiveDir)" SkipUnchangedFiles="true" />
  <Copy SourceFiles="@(Dist)" DestinationFolder="$(PublishDir)\wwwroot\dist\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
person Eric B    schedule 25.01.2017
comment
Contoh kode sepertinya mengharapkan target PrepublishScript di csproj. Templat aplikasi web ASP.NET Core tidak memiliki ini. Dalam kasus seperti itu, apakah Anda cukup menambahkannya di dalam elemen Project? - person Edward Brey; 04.07.2017

Anda mungkin dapat memenuhi kebutuhan Anda dengan Condition seperti:

<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

Sunting:

Atau mungkin mencoba:

<ItemGroup>
  <Content Condition=" '$(Configuration)' == 'Debug'" Remove="wwwroot\dist\**" />
  <Content Condition=" '$(Configuration)' == 'Debug'" Remove="wwwroot\lib\**" />
</ItemGroup>

EDIT 2:

Karena sepertinya IDE akan mengikuti Condition, Anda dapat mengubah item dari Content menjadi None dan menambahkan target BeforePublish yang menambahkan Content item yang setara.

EDIT 3:

Jadi untuk lebih spesifiknya, simpan yang asli

<ItemGroup>
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

dan tambahkan, tepat sebelum </Project>

<Target Name="BeforePublish">
  <ItemGroup>
    <Content Include="wwwroot\dist\**" />
    <Content Include="wwwroot\lib\**" />
  </ItemGroup>
</Target>
person weir    schedule 24.01.2017
comment
Visual Studio 2017 Solution Explorer mengabaikan Condition? Kurasa aku tidak perlu terkejut. Saya menambahkan variasi kalau-kalau itu membujuk perilaku yang diinginkan dari IDE, tapi saya ragu itu akan terjadi. :( - person weir; 25.01.2017
comment
mencobanya, dan penerbitan di visual studio gagal menyalin wwwroot sama sekali, dan menggunakan dotnet terbitkan masih mengecualikan dist dan lib bahkan dengan target BeforePublish - person Eric B; 25.01.2017
comment
Bisakah Anda memberikan baris ‹Content Include lainnya yang ada di file proyek? - person weir; 25.01.2017
comment
tidak ada konten lain yang menyertakan atau menghapus baris - person Eric B; 25.01.2017
comment
Coba ubah nama target dari BeforePublish menjadi BeforeBuild. - person weir; 25.01.2017