डेल्फी एक्सई कस्टम बिल्ड लक्ष्य हमेशा अक्षम होता है


177

मैंने एक कस्टम MSBuild .targetsफ़ाइल बनाई है जिसे मैंने आईडीई के माध्यम से डेल्फी एक्सई परियोजना में शामिल किया है और इसे परियोजना प्रबंधक के संदर्भ मेनू से सक्षम किया है। हालाँकि फ़ाइल मान्य है, लेकिन प्रोजेक्ट फ़ाइल को पुनः सहेजने के बाद यह हमेशा अक्षम हो जाती है।

यहाँ लक्ष्य फ़ाइल का सरलीकृत संस्करण है, जिसका नाम है Custom.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello from custom target"/>
  </Target>
</Project>

अकेले स्टैंड के रूप में यह अपेक्षा के अनुरूप काम करता है: टाइपिंग ...

MSBuild Custom.target /t:Hello

... कमांड लाइन पर अपेक्षित संदेश देता है।

Custom.targetsIDE के माध्यम से डेल्फी परियोजना में जोड़ना परियोजना प्रबंधक में फ़ाइल को अपेक्षित रूप से प्रदर्शित करता है, और .dprojफ़ाइल में अब लाइन है ...

<TargetsFile Include="Custom.targets"/>

मैंने IDE के प्रोजेक्ट मैनेजर में फ़ाइल को राइट-क्लिक किया और चयनित किया Enable। लेकिन जब परियोजना Buildसंदेश खिड़की प्रदर्शित करता है बनाया गया है:

[MSBuild चेतावनी] Custom.targets (1): अक्षम आयात की अनदेखी: PathToProjectSource\\Custom.targets

प्रोजेक्ट मैनेजर में फिर से राइट-क्लिक करना अभी भी Enableउम्मीद के बजाय विकल्प दिखाता है Disable

कमांड लाइन में MSBuild ProjectName.dproj /t:Helloभी विफल रहता है।

मैंने .dprojलाइन जोड़ने के लिए फ़ाइल हैक करने की कोशिश की है ...

<Import Project="Custom.targets"/>

टाइपिंग MSBuild ProjectName.dproj /t:Helloअब काम करता है। लेकिन अगली बार जब मैं प्रोजेक्ट फाइल को आईडीई से बचाता हूं तो <Import>स्टेटमेंट हटा दिया जाता है।

किसी को भी किसी भी विचार है क्या गलत हो रहा है कृपया?


10
कमांडलाइन से msbuild का उपयोग करने के अपने उदाहरण में, आप Custom.target दिखाते हैं जबकि हर जगह आप Custom.targets का उपयोग करते हैं । यह किसका है?
केनेथ कोचरन

4
अच्छा स्थान - मैंने ध्यान नहीं दिया कि कोड में बहुत घूरने के बावजूद। मैं डेल्फी के साथ मशीन पर कुछ दिनों के लिए (अस्पताल में!) नहीं जा सकता, लेकिन जब मैं कर सकता हूं तो लगातार "लक्ष्य" या "लक्ष्य" का उपयोग करके कोड की कोशिश करूंगा।
डेल्फीडैबलर

6
नहीं एक डेल्फी उपयोगकर्ता, लेकिन के अनुसार इस सभी .targets फ़ाइलें मान्य MSBuild स्क्रिप्ट त्रुटियों के मुक्त होना चाहिए। यदि फ़ाइल में कोई त्रुटि है, तो आपको सूचित किया जाता है और, यदि परियोजना अवैध .targets फ़ाइल का संदर्भ देती है, तो यह अक्षम है और त्रुटियों को ठीक होने तक पुन: सक्षम नहीं किया जा सकता है। डबल जाँच के लायक हो सकता है सब कुछ सही है जैसा कि आपको बताए गए लक्षणों को बताता है।
डैनियल मॉरिसिट

दुर्भाग्य से XE7 में मैं आपकी समस्या को पुन: उत्पन्न नहीं कर सकता, सब कुछ अपेक्षित रूप से काम करता है: कमांड लाइन प्रॉम्प्ट से निर्माण के /t:Helloसाथ-साथ IDE से प्रोजेक्ट मैनेजर में राइट-क्लिक के साथ निर्माण - लक्ष्य - हैलो। मैंने Custom.targetsप्रोजेक्ट मैनेजर में राइट-क्लिक करके प्रोजेक्ट को जोड़ा है - ऐड - (फ़ाइल के लिए ब्राउज़ किया गया)। पथ .dproj फ़ाइल के समान निर्देशिका है।
ओन्ड्रेज केले

जवाबों:


1

डेल्फी पूरे dproj सामग्री को स्वयं उत्पन्न करता है और यह कस्टम आयात हमेशा हटा दिया जाएगा।

आप अपनी खुद की msbuild xml फ़ाइलों को लिख सकते हैं, लेकिन dproj डेल्फी के हैं।

जब तक आपके पास स्रोत कोड नहीं होता है या आप उस ide को बंदर करने के लिए तैयार नहीं होते हैं जो आप नहीं कर सकते।

यदि आप वास्तव में डेल्फी प्रोजेक्ट्स बनाने के लिए एक लचीला xml तरीका चाहते हैं और लक्ष्य बनाने के लिए प्रचुर मात्रा में प्रयास करना चाहते हैं या vnext चाहते हैं (बिटबकेट पर मेरा कांटा)


1

मैं लक्ष्य फ़ाइल को मैन्युअल रूप से शामिल करूंगा और आईडीई के बजाय MSBuild का उपयोग करते हुए बाहरी रूप से निर्माण करूंगा, क्योंकि जब IDE से संकलन यह जानने के लिए कि आपने कौन सा कॉन्फ़िगरेशन और लक्ष्य लागू किया है (क्या परियोजना पर क्लिक किया गया है? या एक से?) सक्षम लक्ष्य? आपको कोई दृश्य संकेत नहीं मिलता है कि एक कस्टम लक्ष्य सक्षम है)।

मैं आमतौर पर ऐसा करता हूं, Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"इसलिए वे आईडीई पर दिखाई नहीं देंगे (वे मौजूद हैं, लेकिन डेवलपर्स के लिए छिपे हुए हैं)।

उदाहरण के लिए मेरी डेल्फी XE4 परियोजनाएं समाप्त होती हैं:

    <Import Project="..\BuildServer.Targets"/>
    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
    <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>

मेरा।

  <PropertyGroup  Condition="'$(Config)'=='CustomConfig'">
    <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
    ...
  </PropertyGroup>
  <Target Name="DisplayProjectInfo">
    <Message Text="Project File Name = $(MSBuildProjectFile)"/>
    <Message Text="Version = $(VerInfo_Keys)"/>
    <Message Text="OutputDir = $(DCC_ExeOutput)"/>
  </Target>
  <Target Name="CustomTarget" Condition="'$(Config)'=='CustomConfig'">
  <MSBuild Projects="$(MSBuildProjectFile)" Targets="Clean" />
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" />
    <CallTarget Targets="DisplayProjectInfo"/>
  </Target>

फिर इसके साथ संकलित करें:

msbuild /t:CustomTarget /p:config=CustomConfig poject.dproj

इस दृष्टिकोण का उपयोग करने से आप यह सुनिश्चित कर सकते हैं कि प्रत्येक एप्लिकेशन किसी भी द्वारा किए गए परिवर्तनों से प्रभावित हुए बिना हर एप्लिकेशन को सही सेटिंग्स प्राप्त करने के लिए बिल्ड लक्ष्य कस्टमाइज़ करे।

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