Barcha *.cshtml fayllari Build Action uchun kontent sifatida o‘rnatilganligiga ishonch hosil qiling

Bir necha marta *.cshtml fayldan nusxa ko'chirganimda, Visual Studio negadir ushbu fayllardagi Build Action ni "Yo'q" qilib qo'yadi: Comments.cshtml Build Action bo'yicha Yo'q sifatida o'rnatildi

Mahalliy ishlayotganingizda buni aniqlash mumkin emas, chunki fayllar mavjud. Ammo WebDeploy orqali tarqatganingizda, Build Action-da "Yo'q" deb belgilangan fayllar paketlanmaydi. Natijada men serverda ishlamaydigan dasturni olaman.

Savol: Bunday hodisalarni avtomatik aniqlash va oldini olishning bir usuli bormi?


person trailmax    schedule 14.01.2015    source manba


Javoblar (4)


"Yo'q" guruhidagi element .cshtml kengaytmasiga ega bo'lsa, ogohlantirish hosil qiladigan kichik snippet bilan .csproj ni kengaytirishingiz mumkin. Snippet quyidagicha bo'ladi:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild">
  <ItemGroup>
    <Filtered Include="@(None)" Condition="'%(Extension)' == '.cshtml'" />
  </ItemGroup>
  <Warning 
    Condition="'@(Filtered)'!=''"
    Code="CSHTML" 
    File="$(MSBuildProjectDirectory)\%(Filtered.Identity)" 
    Text="View is not set to [BuildAction:Content]"
  />
</Target>

Agar siz boshqa qurish amallarini ko'rsangiz (masalan, EmbeddedResource), ularni Filtrlangan element ta'rifiga qo'shishingiz mumkin.

Agar siz yanada rivojlangan aniqlashni istasangiz, ushbu Xpath //ItemGroup/*[not(self::Content)]/@Include ga mos keladigan har qanday element uchun loyiha fayllarini tahlil qilishingiz kerak.

<Target Name="EnsureContentOnViewsXML" BeforeTargets="BeforeBuild">
  <XmlPeek XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix='msb' Uri='schemas.microsoft.com/developer/msbuild/2003'/&gt;"; Query="/msb:Project/msb:ItemGroup/*[not(self::msb:EmbeddedResource)]/@Include">
    <Output TaskParameter="Result" ItemName="AllItems" />
  </XmlPeek>

  <!-- MsBuild uses XPath 1.0 which doesn't have the 'ends-with' or 'matches' function. -->
  <ItemGroup>
    <Filtered Include="@(AllItems)" Condition="'%(Extension)' == '.cshtml'" />
  </ItemGroup>

  <Warning 
    Code="CSHTML" 
    File="$(MSBuildProjectDirectory)\%(Filtered.Identity)" 
    Text="View is not set to [BuildAction:Content]"
    Condition="'@(Filtered)'!=''"
  />
</Target>

<Warning ...> o'rniga <Error ...> dan ham foydalanishingiz mumkin

Loyiha faylingizga ushbu parchalardan birini qoʻlda kiritishingiz kerak boʻladi:

rasm tavsifini shu yerga kiriting

person jessehouwing    schedule 15.01.2015
comment
Bu ishladi, to'g'ri yo'nalishdagi surish uchun rahmat. Faqat Condition="'@(Filtered)'!=''" ni <Warning ga qo'shishim kerak edi - har doim, hatto noto'g'ri fayllar bo'lmasa ham, ogohlantirish berildi - person trailmax; 16.01.2015
comment
Ajoyib javob! Trailmax bilan bir xil muammoga duch keldim. Fikr-mulohaza: ikkinchi variant (XmlPeek bilan) men uchun ishlamadi (ogohlantirishni ko'rsatmaydi), lekin birinchisi juda yaxshi ishladi. Rahmat! - person Augusto Barreto; 28.02.2015
comment
Birinchi variant men uchun ishladi, lekin ikkinchisi yo'q. Men Shart bilan bir oz o'ynadim, lekin uni ishga tushira olmadim. - person Mark Good; 13.10.2015
comment
Men haqiqatan ham XmlPeek yondashuvidan foydalanmoqchi edim, chunki u ancha toza, lekin boshqalar aytganidek, bir xil muammoga duch keldim, hech qanday element mos kelmadi. Ma'lum bo'lishicha, bu nomlar maydoniga bog'liq. <XmlPeek XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;" Query="/msb:Project/msb:ItemGroup/*[not(self::EmbeddedResource)]/@Include"> - person Sam; 23.12.2015
comment
Yuqoridagi kodda xatolik yuz berdi, "EmbeddedResource"da nom maydoni ham bo'lishi kerak: XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;" Query="/msb:Project/msb:ItemGroup/*[not(self::msb:EmbeddedResource)]/@Include"> - person Sam; 23.12.2015
comment
Ajoyib maslahat! Buni loyihaga qo'shish uchun ba'zi qo'shimchalar bo'lsa ajoyib bo'ladi. - person Caverna; 08.09.2016
comment
Ajoyib parcha. Ushbu oltin MSBuild nuggetini baham ko'rganingiz uchun tashakkur! - person Daniel Lidström; 18.10.2016

Meni boshlaganingiz uchun jessehouwing sizga rahmat! Menga sizning yechimingiz yoqdi va unga ovoz berdim. Men u bilan bir oz muammoga duch keldim va quyidagi bilan yakunlandim:

<Target Name="EnsureContentOnViews" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Filtered Include="@(None)" Condition="'%(Extension)' == '.cshtml'" />
    </ItemGroup>
    <Error Condition="'@(Filtered)'!=''" Code="CSHTML" File="%(Filtered.Filename)" Text="Not set to [BuildAction:Content]: Identity: %(Filtered.Identity)" />
</Target>

csproj faylida mening </Project> tegim oldida.

person Jacob Brewer    schedule 01.03.2016

Albatta, @jessehouwing men uchun ishlagan! Shunday qilib, bu tuzatish mening .csproj faylimda yaxshi saqlanib qoladi :).... Faqat, men ikki marta tekshirib ko‘rdim va go‘yo o‘sha yoqimli parcha boshqa dasturchining birlashishi yoki biror narsa tufayli so‘nggi oyda biror joyda g‘oyib bo‘lganga o‘xshaydi.. (haqiqiy voqea). )

NPM alternativi

Baribir, men yaratgan check-vs-includes NPM modulini eslatib o‘tmoqchiman. Buning uchun. Bu, ayniqsa, Tugun o'rnatilgan ishlab chiquvchilar uchun qulaydir (agar o'rnatmasangiz, ehtimol kerak :) ).

Men har bir tuzilishda emas, har bir joylashtirishdan oldin tekshirishni qo'lda bajaraman. Ammo birlashma tufayli .csproj faylingizdan yo'qolib qolish ehtimoli kamroq (sezmasdan).

Biroq, ushbu NPM paketidan foydalanishning asosiy afzalligi shundaki, Build Action NONE-ni tekshirishdan tashqari, u sizning loyihangizga umuman kiritilmagan fayllarni ham tekshiradi. Chunki bu Visual Studio'ning Web Deploy dasturidan foydalanganda (nozik, ammo yomon) xatolarga olib kelishi mumkin. Quyidagi hollarda etishmayotgan qo'shimchalar bo'lishi mumkin: 1) jamoangizda 1 ta VS bo'lmagan dasturchi bo'lsa yoki 2) .csproj faylining birlashishi (ko'pincha birlashma bilan bog'liq muammolar mavjud) tufayli.

Ko'rsatmalar uchun NPM sahifasini tekshiring. Ammo quyida siz Node va Gulp dan foydalanasiz deb taxmin qilinadigan oddiy misol:

Oddiy misol

  1. #P6#
    #P7#
  2. gulpfile.js-ga vazifa qo'shing:

     var checkVSIncludes = require('check-vs-includes');

     ...

     gulp.task('checkVSIncludes', function() {
        checkVSIncludes(['/Views/**/*.cshtml', '/app/**/*.js']);
     });
  1. Tekshirishni loyihangiz papkasida bajaring (masalan, .csproj faylingiz qaerda)
    #P9#
person Bart    schedule 14.07.2015
comment
Tekshirishni bajarish uchun Visual Studio'ning Vazifalarni bajaruvchisi Explorer kengaytmasidan foydalanaman. 3-banddagi buyruq o'rniga. Agar siz 1-bandni o'rnatganingizdan keyin --save-dev ni qo'shsangiz, sizning hamkasblaringiz ham ushbu avtomatlashtirilgan tekshirishdan foyda olishlari mumkin. (Ushbu devga bog'liqlikni olish uchun ular npm install ni bir marta ishlatishlari kerak). Va hali ham Visual Studio'ning Express nashrida (kengaytmalarni o'rnatishga ruxsat bermaydigan) o'quvchilar uchun hozir Visual Studio 2013 Community Edition-ga yangilang (bu ham bepul va ham bepul :) ). - person Bart; 14.07.2015
comment
Boshqa odamlar uchun yaxshi yozish uchun ovoz bering. Lekin men tugun yoki gulp ishlatmayman, men uchun juda foydasiz. - person trailmax; 15.07.2015

Men maxsus qurish vazifasini amalga oshirishni taklif qilaman. Uni msbuild/tfs skriptingizda prebuild-da chaqiring. Maxsus qurish vazifasi .scproj faylini tekshirishi kerak, agar hech qanday qurish amali boʻlmagan cshtml qoʻshish fayli mavjud boʻlsa. Shunday qilib, nolga teng bo'lmagan int qiymatini qaytarib, chiqing.

person Miloš Cigoj    schedule 15.01.2015
comment
Xo'sh, ushbu qurish harakati qanday aniq amalga oshirilmoqda? - person trailmax; 15.01.2015