2012-07-11 14 views
9

में अवैध वर्ण मैं निर्माण के लिए काम करने के लिए एक MSBuild स्क्रिप्ट प्राप्त करने के लिए कोशिश कर रहा हूँ और तैनाती के लिए एक काफी बड़े वेब अनुप्रयोग निकालने। (हम यहाँ कई दर्जन निर्देशिका में कुछ हजार फाइलों बात कर रहे हैं। यह बहुत ज्यादा एक विरासत, विरासत codebase है, तो बहुत ज्यादा नहीं मैं इसके बारे में क्या कर सकते हैं।) का निर्माण अपने आप ठीक चलाता है, लेकिन मैं कॉपी करने प्राप्त नहीं कर पा रहे ठीक से काम कर रहे एक ड्रॉप स्थान पर फ़ाइलें।प्रतिलिपि बनाई जा रही निर्माण उत्पादन फाइलें, निर्देशिका संरचना के संरक्षण, देता है `path`

यहाँ एक टुकड़ा दिखाई दे रहा है कि मैं क्या निर्माण लिपि में है:

<PropertyGroup Condition=" '$(UseBuildNumber)' == 'true' "> 
    <ReleaseDirectory>$(ReleaseBaseDirectory)$(ReleaseName)\$(BuildNumber)</ReleaseDirectory> 
</PropertyGroup> 

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)**\*.aspx; 
       $(SourceRoot)**\*.dll; 
       $(SourceRoot)**\*.gif; 
       $(SourceRoot)**\*.ascx; 
       " /> 
</ItemGroup> 

<Message Text="Output files ==> @(OutputFiles)" /> 

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)" 
    SkipUnchangedFiles="false" 
    /> 

मैं कुछ अतिरिक्त <Message/> वहाँ में डाल दिया है की पुष्टि है कि अलग-अलग रास्तों को सही ढंग से विस्तार, और दोनों $(SourceRoot) और $(ReleaseDirectory) वास्तव में क्या है सही पथ हालांकि, उत्पादन में, मैं (पूर्ण पथ संक्षिप्तता के लिए elided) मिलती है:

Task "Message" 
    Output files ==> ...\Requirement1866**\*.aspx;...\Requirement1866**\*.dll;...\Requirement1866**\*.gif;...\Requirement1866**\*.ascx 
Done executing task "Message". 

जाहिर है, वाइल्डकार्ड विस्तार प्रदर्शन नहीं किया गया है, और फिर निम्न Copy (जाहिर पर्याप्त) विफल रहता है। मैं केवल एक ही शामिल हूं; हकीकत में यह प्रत्येक फ़ाइल नाम वाइल्डकार्ड पैटर्न के लिए दोहराया जाता है (जो बदले में बिल्ड स्क्रिप्ट स्निपेट में शामिल किए गए कई से अधिक हैं)।

d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

केवल यथोचित प्रासंगिक हिट मैं Googling इस Copy Task - Illegal characters in path था पर मेरे प्रयासों में सामने आने वाले हैं, लेकिन मैं पहले से ही एक <ItemGroup>, और <CreateItem> उदाहरण उपयोग कर रहा हूँ (अनुकूलित:

Using "Copy" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
Task "Copy" 
    Copying file from "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". 
    Command: 
    copy /y "*basedir*\Requirement1866**\*.aspx" "*targetdir*\Requirement1866\*buildnumber*\*.aspx" 
d:\Builds\215\BuildType\TFSBuild.proj(120,5): error MSB3021: Unable to copy file "*basedir*\Requirement1866**\*.aspx" to "*targetdir*\Requirement1866\*buildnumber*\*.aspx". Illegal characters in path. 

द्वारा पीछा किया) सब पर काम नहीं किया, कह रही है कि TaskParameter अज्ञात था (क्षमा करें, मैं मेरे सामने सटीक त्रुटि संदेश नहीं है) एक त्रुटि के साथ जल्दी निरस्त किया जा रहा।

एक कामचलाऊ उपाय के रूप में, मैं में जा सकते हैं और मैन्युअल रूप से जहां मैं उन्हें चाहते हैं कि निर्माण उत्पादन निर्देशिका से प्रासंगिक फ़ाइलों की प्रतिलिपि, लेकिन मुझे लगता है कि इस प्रक्रिया को स्वचालित किया जा करना चाहते हैं।

मैं एमएसबिल्ड का उपयोग करके, कैसे उत्पादन प्रक्रिया के दौरान बनाई गई फ़ाइलों को कॉपी करता हूं, जबकि संबंधित निर्देशिका संरचना को संरक्षित करते हुए, उन्हें एक-एक करके सूचीबद्ध किए बिना?

+0

मेरे पास सीधा जवाब नहीं है, लेकिन मुझे पहले भी इस समस्या का सामना करना पड़ा है। मैंने इसे करने के लिए एक PowerShell स्क्रिप्ट लिखना समाप्त कर दिया और इसे पोस्ट-बिल्ड एक्शन के रूप में बुलाया। इसके अलावा, प्रश्न के लिए +1 क्योंकि यह बहुत प्रभावशाली ढंग से शोध किया गया है। मैं सही उत्तर पोस्ट करने के लिए तत्पर हूं! – allquixotic

उत्तर

20

असल में, ** एक भी पथ-तत्व है और इस प्रकार तदनुसार Include निर्देश में बैकस्लैश-सीमांकित होना चाहिए:

<ItemGroup> 
    <OutputFiles Include=" 
       $(SourceRoot)\**\*.aspx; 
       $(SourceRoot)\**\*.dll; 
       $(SourceRoot)\**\*.gif; 
       $(SourceRoot)\**\*.ascx; 
       " /> 
</ItemGroup> 

नोट जैसे निर्दिष्ट करने के बीच अंतर टूटा $(SourceRoot)**\*.aspx के विपरीत $(SourceRoot)\**\*.aspx। यदि $(SourceRoot) एक \ साथ समाप्त हो गया था, वाइल्डकार्ड विस्तार शायद बहुत पहली बार में काम किया होता।

दूसरा, <Copy/> में, का उपयोग %(RecursiveDir):

<Copy 
    SourceFiles="@(OutputFiles)" 
    DestinationFolder="$(ReleaseDirectory)\%(RecursiveDir)" 
    SkipUnchangedFiles="false" 
    /> 
इन परिवर्तनों के साथ

, यह काम करने के लिए बस की तरह मैं यह चाहते हैं कि प्रतीत होता है: फ़ाइलों अभीष्ट लक्ष्य निर्देशिका को कॉपी कर रहे हैं, और स्रोत पर निर्देशिका संरचना लक्षित स्थान में संरक्षित है।

2

एक और सुझाव है, हर फ़ाइल प्रकार के लिए भी शामिल है जोड़ने के बजाय, यह इससे बाहर रखा गया जोड़ना आसान है।

<ItemGroup> 
    <OutputFiles Include="$(SourceRoot)**\*.*" Exclude="$(SourceRoot)**\*.cs;$(SourceRoot)**\*.resx" " /> 
</ItemGroup> 

इस तरह आउटपुट में किसी भी जेएस, एचटीएमएल, डीएचटीएम और अन्य फ़ाइल प्रकार शामिल होंगे।

+0

किसी की जरूरतों के आधार पर दृष्टिकोण या तो काम करता है। मेरे विशेष मामले में, यह गणना करना काफी आसान था कि मैं प्रतिलिपि बनाना चाहता था और बस बाकी सब कुछ बाहर कर देना चाहता था। –

संबंधित मुद्दे