मेरी परिदृश्य में, मैं अपने ASP.Net वेबसाइट के साथ एक पर्ल दुभाषिया जहाज करने के लिए है (पूछना नहीं क्यों मैं पर्ल की जरूरत है, और मुझे खेद है मैं पहले से कर रहा हूँ!), और कहा कि .c फाइलें शामिल हैं जो aspnet_compiler.exe को त्रुटि के कारण उत्पन्न करती हैं, क्योंकि अन्य ने अपनी समस्या का उल्लेख किया है। Perl निर्देशिका मेरे बिन फ़ोल्डर में है, और रनटाइम पर आवश्यक है।
मुझे मिली समस्या जब आप attrib +H
फ़ोल्डर में थे, तो यह वास्तव में aspnet_compiler द्वारा छोड़ा गया था, लेकिन तब मेरे प्रकाशित आउटपुट फ़ोल्डर में नहीं होगा।इसलिए मुझे फ़ोल्डर को छिपाने, विचारों को संकलित करने, फ़ोल्डर को अनदेखा करके और फिर फ़ोल्डर को सही स्थान पर कॉपी करके इसे और भी हैक करना पड़ा। इसमें मूल AspNetPreCompile
कार्य को संशोधित करना शामिल था। नीचे देखें:
<!-- Overwrite AspNetPreCompile task because it was trying to compile .c files found in the Perl directory. This prevents that but still copies Perl to publish file. -->
<!-- Taken from: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\Web\Transform -->
<Target Name="AspNetPreCompile" DependsOnTargets="$(AspNetPreCompileDependsOn)" Condition="'$(AspNetPreCompile)' != 'false'">
<PropertyGroup Condition="'$(UseMetabasePath)' == 'true'" >
<_PreAspnetCompileMergeSingleTargetFolderFullPath></_PreAspnetCompileMergeSingleTargetFolderFullPath>
<_AspNetCompilerVirtualPath></_AspNetCompilerVirtualPath>
</PropertyGroup>
<PropertyGroup Condition="'$(UseMetabasePath)' != 'true'" >
<_PreAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PreAspnetCompileMergeSingleTargetFolder)))</_PreAspnetCompileMergeSingleTargetFolderFullPath>
</PropertyGroup>
<PropertyGroup>
<_PostAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PostAspnetCompileMergeSingleTargetFolder)))</_PostAspnetCompileMergeSingleTargetFolderFullPath>
</PropertyGroup>
<!-- Modification #1. -->
<Exec Command="attrib +H "$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl"" />
<AspNetCompiler
PhysicalPath="$(_PreAspnetCompileMergeSingleTargetFolderFullPath)"
TargetPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)"
VirtualPath="$(_AspNetCompilerVirtualPath)"
Force="$(_AspNetCompilerForce)"
Debug="$(DebugSymbols)"
Updateable="$(EnableUpdateable)"
KeyFile="$(_AspNetCompileMergeKeyFile)"
KeyContainer="$(_AspNetCompileMergeKeyContainer)"
DelaySign="$(DelaySign)"
AllowPartiallyTrustedCallers="$(AllowPartiallyTrustedCallers)"
FixedNames="$(_AspNetCompilerFixedNames)"
Clean="$(Clean)"
MetabasePath="$(_AspNetCompilerMetabasePath)"
ToolPath="$(AspnetCompilerPath)"
/>
<!-- Modification #2. -->
<Exec Command="attrib -H "$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl"" />
<!--
Removing APP_DATA is done here so that the output groups reflect the fact that App_data is
not present
-->
<RemoveDir Condition="'$(DeleteAppDataFolder)' == 'true' And Exists('$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data')"
Directories="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data" />
<CollectFilesinFolder Condition="'$(UseMerge)' != 'true'"
RootPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)" >
<Output TaskParameter="Result" ItemName="_AspnetCompileMergePrecompiledOutputNoMetadata" />
</CollectFilesinFolder>
<ItemGroup Condition="'$(UseMerge)' != 'true'">
<FileWrites Include="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\**"/>
</ItemGroup>
<!-- Modification #3. -->
<ItemGroup>
<Perl Include="$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\perl\**\*.*" />
</ItemGroup>
<!-- Modification #4. -->
<Copy SourceFiles="@(Perl)" DestinationFolder="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\bin\perl\%(RecursiveDir)"></Copy>
</Target>
मूल .targets फ़ाइल को संशोधित नहीं करते हैं, <project>
नोड के लिए एक बच्चे के रूप में अपने .csproj फ़ाइल में इस कॉपी।
में महत्वपूर्ण परिणाम:
उपयोग attrib +H Directory
को Exec
आदेश AspNetCompiler कार्य के माध्यम से aspnet_compiler.exe चलाने से पहले, और बाद में attrib -H Directory
।
उन सभी फ़ाइलों में चूसने के लिए ItemGroup
बनाएं जिन्हें अभी भी कॉपी करने की आवश्यकता है।
Copy
कार्य को ItemGroup
का उपयोग करके उन फ़ाइलों को रखने के लिए चलाएं जहां उन्हें प्रकाशित करने के लिए शेष प्रकाशन कार्य के क्रम में होना आवश्यक है। हम इस कार्य को संलेखित करते समय माइक्रोसॉफ्ट द्वारा किए गए सभी चर का उपयोग करते हैं, इसलिए हम यहां उन लोगों का भी उपयोग कर सकते हैं।
मूल कार्य को संशोधित करने के लिए प्रो: सामान्य व्यवहार के बारे में बहुत कम परिवर्तन, इसलिए इसे अभी भी काम करना चाहिए।
मूल कार्य को संशोधित करने के लिए संभावित con: Microsoft इस कार्य को भविष्य में बदल सकता है, जिससे हमारी प्रतिलिपि पुरानी हो जाती है।
<Target Name="Test" BeforeTargets="AspNetPreCompile">
<Exec Command="attrib +H Directory" />
</Target>
<Target Name="Test" AfterTargets="AspNetPreCompile">
<Exec Command="attrib -H Directory" />
</Target>
उत्तर टिप्पणी आर्थर Nunes जवाब में किए गए twamley से प्रेरित:
तुम मेरी अजीब आवश्यकताओं की जरूरत नहीं है, तो एक फ़ोल्डर छुपा के लिए सरल समाधान इस प्रकार है।
मेरी भलाई! - इस पोस्ट के लिए आपको बहुत बहुत धन्यवाद - आपने शायद मुझे निराशा के दिन बचाए क्योंकि यह वही है जो हमारे साथ हुआ था। क्या आपको कभी किसी फ़ोल्डर को अनदेखा करने का कोई तरीका मिला है? (हालांकि मेरी पहली पसंद रेपो से अपमानजनक फाइलों को मिटाना है।) – Edward
नहीं, एडवर्ड, मुझे "प्रीकंपाइल बेयरफब्लिश" अक्षम रखना पड़ा। हालांकि, मैंने इस समस्या के तुरंत बाद उस परियोजना पर काम करना बंद कर दिया, तो हो सकता है कि उत्तर अभी भी कहीं बाहर है =] –
@ एडवर्ड मैं बस इसमें भी भाग गया। Aspnet_compiler.exe चलाने से पहले मेरी बिल्ड स्क्रिप्ट में छिपी हुई विशेषता ('attrib + H c: \ path \ to \ problem \ directory') के साथ मेरे संकलन आवश्यक फ़ोल्डरों को चिह्नित करने के साथ अब तक मेरी शुभकामनाएं मिली हैं, फिर छिपी हुई विशेषता को रीसेट करना जब ये पूर्ण हो जाए। – twamley