वहाँ asp.net परियोजना फ़ाइल में सामग्री फ़ाइलों को स्वचालित रूप से शामिल करने का एक तरीका है?


86

मैं अक्सर अपने ASP.NET प्रोजेक्ट में बहुत सी कंटेंट फाइल (ज्यादातर इमेज और js) जोड़ रहा हूँ। मैं VS प्रकाशन प्रणाली का उपयोग कर रहा हूं, और प्रकाशित होने पर, नई फाइलें तब तक प्रकाशित नहीं होती हैं जब तक कि मैं उन्हें परियोजना में शामिल नहीं करता। मैं ऑटो को निर्दिष्ट निर्देशिका में सभी फाइलें शामिल करना चाहूंगा। क्या यह निर्दिष्ट करने का कोई तरीका है कि कौन सी निर्देशिकाओं को csproj फ़ाइल में ऑटो-शामिल किया जाना चाहिए या कहीं और?


देखें: यह आपकी मदद कर सकता है stackoverflow.com/questions/1743432/…
Saar

1
बिल्कुल नहीं, जो मैं देख रहा हूँ
मार्को

जब मैंने आपके बनाम समाधान ब्राउज़र के अंदर फ़ोल्डर को संशोधित करते हुए अपने मुद्दे को छुपाते हुए अपना उत्तर अपडेट किया।
फिल्बर्ट

जवाबों:


134

पुराना धागा, मुझे पता है, लेकिन मुझे ऐसा करने का एक तरीका मिला जिसे मैं भूलता रहता हूं, और आखिरी बार इसे खोजने के लिए मेरी खोज पर, मैं इस सवाल पर लड़खड़ा गया। सबसे अच्छा तरीका मुझे यह मिला है कि .csproj फ़ाइल में पहले के लक्ष्य का उपयोग करना है।

<Target Name="BeforeBuild">
    <ItemGroup>
        <Content Include="**\*.less" />
    </ItemGroup>
</Target>

वीएस 2010 इस अनुभाग को नहीं छूएगा, और यह सुनिश्चित करता है कि आपकी फाइलें परियोजना के निर्माण के दौरान हर बार सामग्री के रूप में शामिल हों।


अशुभ का अर्थ क्या है? और पूरे स्ट्रिंग का क्या मतलब है **\*.less?
पंजीकृत उपयोगकर्ता

3
.less फाइलें सीएसएस फाइलें होती हैं, जिन्हें कम CSS प्रीप्रोसेसर द्वारा पार्स किया जाता है। उस पर अधिक जानकारी के लिए Google "डॉट कम"। अभिव्यक्ति का **\*.lessमतलब सभी निर्देशिकाओं में सभी *। रहित फ़ाइलें शामिल हैं। MSBUILD में बोलते हैं, ** का अर्थ है 'सभी निर्देशिकाएं पुनरावर्ती'
क्रिस

4
कम से कम वीएस 2012 में, जैसे ही आप परियोजना से एक फ़ाइल जोड़ते / हटाते हैं और सहेजते हैं, यह दुर्भाग्य से पूरी सूची में विस्तारित हो जाता है। :(
क्रिस फिलिप्स

3
यह मेरी स्थिति के लिए काम करता है, इससे पहले कि मैं अपने बिल्डबाय को बदलने के बाद, मेरे बिल्ड ने एक शिल्पी स्क्रिप्ट को बंद कर दिया, जो फाइलों को इधर से उधर करती है, जो तब मेरे azure वेब परिनियोजन प्रयास द्वारा नहीं उठाया जाएगा क्योंकि वे केवल बिल्ड के सफल होने के बाद मौजूद थे। "बीटरबील्ड" को देखकर मुझे लगा कि शायद "एटरबाइल्ड" भी है। मनाइए कि यह किसी और के लिए सहायक हो।
ल्यूक राइस

1
@ जॉन ने वीएस २०१५ + के लिए मेरे जवाब को नीचे देखें ।
जेसी

54

आप बस अपनी वेबसाइट .csproj फ़ाइल का विस्तार कर सकते हैं। बस अपने सामग्री रूट फ़ोल्डर को पुनरावर्ती वाइल्डकार्ड के साथ जोड़ें:

...
<ItemGroup>
    <!-- your normal project content -->
    <Content Include="Default.aspx" />

    <!-- your static content you like to publish -->
    <Content Include="Images\**\*.*" />
</ItemGroup>
...

ऐसा करने से यह फ़ोल्डर और नीचे दी गई सभी सामग्री आपके समाधान ब्राउज़र के अंदर दिखाई देती है।

यदि आप निर्दिष्ट करके ब्राउज़र को समाधान ब्राउज़र के अंदर छिपाने का प्रयास करते हैं

<Content Include="Images\**.*.*">
    <Visible>false</Visible>
</Content>

इसे प्रकाशित नहीं किया जाएगा।


अपडेट करें

जैसा कि आपको पहले से पता था कि वाइल्डकार्ड को आपके समाधान के अंदर फ़ोल्डर को छूते ही बदल दिया जाएगा क्योंकि वीएस प्रोजेक्ट्स में मनमाना कंटेंट नहीं है।

तो आपको यह सुनिश्चित करना होगा कि फ़ोल्डर और उसकी सामग्री को वीएस के भीतर से कभी भी संशोधित नहीं किया गया है - फ़ाइलों को जोड़ना या निकालना केवल फ़ाइल सिस्टम पर किया जा सकता है ... जो कि आप चाहते थे जैसा कि मैंने आपके प्रश्न को समझा था।

यह आसान होगा यदि फ़ोल्डर को वीएस में छिपाया जा सकता है लेकिन मुझे इसे छिपाने और प्रकाशित करने का कोई तरीका नहीं मिल सकता है।

एक अन्य असफल दृष्टिकोण फ़ोल्डर को CreateItemटास्क द्वारा शामिल करना था । इसके परिणामस्वरूप फ़ोल्डर की सामग्री को \ bin \ app.publish \ ... पर प्रकाशित किया जा रहा है और इसे .csproj के अंदर सामग्री आइटम के साथ प्रकाशित करने के लिए आश्वस्त नहीं किया जा सकता है, इसलिए मैंने इसे अपने उत्तर में प्रस्तुत नहीं किया।


3
यह तब तक काम करता है जब तक मैं फ़ाइल को मैन्युअल रूप से जोड़ या हटा नहीं देता। उस लाइन के बाद <सामग्री शामिल करें = "छवियां * *। " /> परियोजना फ़ाइल से गायब हो जाती है।
मार्को

2
@ मार्को सही है। जोड़ने के बाद <Content Include="Images\**\*.*" />यह काम किया। एक बार जब आप अधिक छवियां जोड़ते हैं। .csproj को बदल दिया जाता है और वापस छवियों में सभी फ़ाइलों को सूचीबद्ध करने के लिए वापस आ जाता है / ... और <सामग्री शामिल करें = "छवियाँ * *। " /> चला गया है।
रवि राम

इस कोड को एक अलग .proj फ़ाइल में चिपकाएँ और .csproj फ़ाइल में लक्ष्य बनाने से पहले कॉल करें।
एनएल -

21

क्रिस के उत्तर का उपयोग करने वाले मुद्दों के लिए , यह विज़ुअल स्टूडियो 2012 और नए के लिए समाधान है:

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

जैसा कि क्रिस ने अपने जवाब में उल्लेख किया है - विज़ुअल स्टूडियो इस खंड को नहीं छूएगा <Target>, भले ही आप मैन्युअल रूप से लक्ष्य निर्देशिका के साथ (फ़ाइलों को जोड़ने / हटाने) के आसपास फील करें।

कृपया ध्यान दें कि आपको एक उपनिर्देशिका शामिल करनी चाहिए जहां फाइलें स्थित हैं (ऊपर मामले में, यह है images)। Visual Studio / MSBuild उन फ़ाइलों को प्रोजेक्ट संरचना में एक ही डायरेक्टरी में रखेगा। यदि आप एक उपनिर्देशिका का उपयोग नहीं करते हैं, तो फ़ाइलों को परियोजना संरचना के मूल में रखा जाएगा।

वाइल्डकार्ड की त्वरित व्याख्या के लिए:

  • **मतलब सब कुछ पुनरावर्ती (फ़ाइलें, उपनिर्देशिका, और उन के भीतर फ़ाइलें)
  • *.extextशीर्ष-स्तरीय निर्देशिका में एक्सटेंशन वाली सभी फाइलें शामिल होंगी , लेकिन उपनिर्देशिकाएं नहीं
    • उदाहरण के लिए, *.extहो सकता है *.png, *.jsआदि किसी भी फाइल एक्सटेंशन काम करेंगे
  • **\*.extextशीर्ष-स्तरीय निर्देशिका और सभी उपनिर्देशिकाओं से विस्तार के साथ सभी फाइलें शामिल होंगी ।
  • उत्तर देखें कि मैं Nant / Ant नामकरण पैटर्न का उपयोग कैसे करूँ? उदाहरणों के साथ अधिक संपूर्ण विवरण के लिए।

पूरा करने के लिए, कृपया ध्यान दें कि इसका उपयोग करने <Target>और न करने के बीच अंतर है।

<Target>दृष्टिकोण के साथ , विज़ुअल स्टूडियो समाधान एक्सप्लोरर के भीतर फाइलों को नहीं दिखाएगा।

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

गैर- <Target>दृष्टिकोण समाधान एक्सप्लोरर के भीतर फाइलों को दिखाने के लिए विजुअल स्टूडियो को निर्देश देगा । इस एक के साथ दोष यह है कि स्वचालित निर्देशिकाओं के किसी भी हेरफेर से वाइल्डकार्ड प्रविष्टि को ओवरराइड करने के लिए विजुअल स्टूडियो का कारण होगा। यह भी ध्यान दिया जाना चाहिए कि नीचे का दृष्टिकोण केवल वीएस में समाधान / परियोजना खोलने पर समाधान एक्सप्लोरर को अपडेट करेगा । यहां तक ​​कि समाधान एक्सप्लोरर के "ताज़ा" टूलबार बटन ऐसा नहीं करेगा।

<ItemGroup>
  <Content Include="images\**" />
</ItemGroup>

1
प्रयोग करने और <लक्ष्य> का उपयोग करने के बीच के अंतर को इंगित करने के लिए धन्यवाद और नहीं। वाइल्डकार्ड्स के विवरण की महान व्याख्या भी।
कर्ट हचिंसन

@ कर्ट हचिंसन - कोई समस्या नहीं। =)
जेसी

मेरा मानना ​​है कि इस समाधान को चमकाने की जरूरत है। जब आप टारगेट को "प्रायरबिल्ड" के बाद चलाने का निर्देश देते हैं तो सिद्धांत रूप में यह AFTER प्रकाशित भी हो सकता है। वर्तमान समाधान शायद भाग्य के कारण काम करता है।
इमरू पुह्वल

@ ImrePühvel आप कैसे प्रकाशित करते हैं कि घटना से पहले क्या होता है BeforeBuild? MSBuild को पहले प्रोजेक्ट और बायनेरिज़ का निर्माण करना होगा, इससे पहले कि वह प्रकाशन पर भी विचार कर सके।
जेसी

1
मैंने निर्माण से पहले प्रकाशित होने का दावा नहीं किया, लेकिन यह घोषणा की गारंटी नहीं है कि आइटम को प्रकाशित करने से पहले सामग्री में जोड़ा जाता है। कोड नमूने से .. AfterTargets="BeforeBuild":। मतलब, युरो कस्टम टारगेट को बिफर्ड के बाद निष्पादित करना चाहिए, लेकिन यह निर्दिष्ट नहीं करता है कि कितने के बाद। हालाँकि, मेरी गलती, वर्तमान लक्ष्य आदेश एल्गोरिथ्म द्वारा यह ठीक होना चाहिए: msdn.microsoft.com/en-us/library/ee216359.aspx
Imre Pühvel

10

आप फ्रेमवर्क की System.IO.Directory.GetFile(string)विधि और इसके अधिभार का पुन: उपयोग करने के लिए सभी फ़ाइलों को शामिल कर सकते हैं।

  <ItemGroup>
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Scripts\', '*.js', SearchOption.AllDirectories))" />
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Images\', '*.png', SearchOption.AllDirectories))" />
  </ItemGroup>

यह मेरे लिए एक बड़ी मदद थी; मेरे पास कई निर्देशिकाएं हैं कुछ स्तर गहरे और बहुत सारी फाइलें जो मैं चाहता था ऑटो-शामिल और यह उन सभी सामग्रियों को एक में बदल दिया। धन्यवाद!
जे ओट्टरबीन

2
मैंने इसके साथ कुछ और प्रयोग किए और यह पता चला कि Include="**\*.ext"वाइल्डकार्ड के साथ इसकी सभी सीमाएं समान हैं ।
स्टीवन लेकेन्स

वाह, क्या प्रोजेक्ट फ़ाइल में रनशेल शामिल है? क्या वह सैंडबॉक्स है? यह एक शोषण होने की प्रतीक्षा कर रहा है।
ब्रेन २००

यह पॉवरशेल नहीं है। स्थैतिक विधियों को लागू करने के लिए MSBuild का अपना सिंटैक्स है। डॉक्स के अनुसार, यह एक सिस्टम क्लासेस तक सीमित है। docs.microsoft.com/en-us/visualstudio/msbuild/… हालाँकि मुझे यकीन है कि आप बस किसी भी तर्क के साथ <Exec> शक्तियां प्राप्त कर सकते हैं ...
स्टीवन लेकेन्स

3

मैंने लिखा है कि कैसे मैं एक छोटी सी पॉवरशेल स्क्रिप्ट के साथ बनाई गई सामग्री को शामिल करने में सक्षम था:

$folders = Get-ChildItem .\ -r -Directory
$filtered = $folders |Select-Object @{Name='FullName';Expression={$_.fullname.replace($pwd,'')}}, @{Name='FolderDepth';Expression={($_.fullname.Split('\').Count) - ($Pwd.Path.split('\').count)}} | Sort-Object -Descending FullName,folderDepth 
$basefolders = $filtered | Where-Object{$_.folderdepth -eq 1}
$basefoldersobj = @()
foreach($basefolder in $basefolders)
{
  $basefoldername =$baseFolder.fullname
  $filteredbase = $filtered -match "\$basefoldername\\" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  if($filteredbase -eq $null)
  {
    $filteredbase = $filtered -match "\$basefoldername" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  }
  $obj = New-Object psobject
  Add-Member -InputObject $obj -MemberType NoteProperty -Name 'Folder' -Value $basefolder.fullname.trim('\')
  Add-member -InputObject $obj -MemberType NoteProperty -Name 'DeepestPath' -Value $filteredbase.folderDepth
  $basefoldersobj += $obj
}
$include = '*.*'
foreach($bfolderObj in $basefoldersobj)
{
  $includecount = ''
  $includecount = "\$include" * ($bfolderObj.Deepestpath)
  Write-Output "<content Include=`"$($bfolderObj.folder)$includecount`" /> "
}

इस शक्तिके शीघ्र पर आवश्यक शामिल बयान का उत्पादन करना चाहिए


2

आप इस तरह की लिंक वाली फाइलों को जोड़ सकते हैं, वे खोज योग्य, देखने योग्य हैं, लेकिन वे चेकआउट नहीं करते हैं यदि आप उन्हें बदलने की कोशिश करते हैं, तो दृश्य स्टूडियो वाइल्डकार्ड को भी छोड़ देता है:

  <ItemGroup>
    <Content Include="..\Database Schema\Views\*.sql">
      <Link>Views\*.sql</Link>
    </Content>
  </ItemGroup>

यह .proj फ़ाइल के अंदर जाता है।


1
मैंने यह कोशिश की और वीएस वाइल्डकार्ड को वीएस का उपयोग करके किसी फ़ाइल को जोड़ने या हटाने के लिए अलग-अलग फाइलों के साथ बदल देता है।
carlin.scott

यह बहुत ही सुंदर है, लेकिन आपको वाइल्डकार्ड को लिंक टारगेट से हटा देना चाहिए
SimSimY

1

मेरी जानकारी मे नहीं; हालाँकि मेरा सुझाव उन्हें परियोजना में चिपकाना है क्योंकि इसमें उन्हें डिफ़ॉल्ट रूप से शामिल किया जाएगा। इसलिए, उन्हें एक्सप्लोरर के माध्यम से निर्देशिका में चिपकाने के बजाय, फ़ोल्डर्स में फ़ाइलों को चिपकाने के लिए विज़ुअल स्टूडियो का उपयोग करें।


-1

मैंने महसूस किया कि इसके लिए सबसे अच्छा समाधान मैन्युअल रूप से एक-एक करके फाइलें जोड़ना है। यदि आपके पास उनमें से सैकड़ों हैं जैसा कि मैंने किया था तो यह केवल कुछ घंटों का मामला था। मजेदार बात यह है कि 2016 में भी वीएस 2015 के साथ यह गंभीर समस्या अभी भी हल नहीं हुई है। आह, मैं Xcode कैसे प्यार करता हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.