เป้าหมายการสร้างแบบกำหนดเอง Delphi XE ถูกปิดใช้งานเสมอ


177

ฉันได้สร้าง.targetsไฟล์MSBuild ที่กำหนดเองซึ่งฉันได้รวมไว้ในโครงการ Delphi XE ผ่าน IDE และเปิดใช้งานจากเมนูบริบทของ Project Manager แม้ว่าไฟล์จะตรวจสอบความถูกต้องมันก็จะถูกปิดการใช้งานเสมอหลังจากที่ฉันบันทึกไฟล์โครงการอีกครั้ง

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.targetsโครงการ Delphi ผ่าน IDE จะแสดงไฟล์ในตัวจัดการโครงการตามที่คาดไว้และ.dprojตอนนี้ไฟล์มีบรรทัด ...

<TargetsFile Include="Custom.targets"/>

ผมคลิกขวาแฟ้มในผู้จัดการโครงการ IDE Enableและเลือก แต่เมื่อโครงการสร้างขึ้นBuildหน้าต่างข้อความจะปรากฏขึ้น:

[คำเตือน MSBuild] Custom.targets (1): ละเว้นการนำเข้าที่ถูกปิดใช้งาน: PathToProjectSource\\Custom.targets

คลิกขวาอีกครั้งในผู้จัดการโครงการยังคงแสดงให้เห็นถึงตัวเลือกแทนการที่คาดว่าจะEnableDisable

ที่บรรทัดคำสั่งMSBuild ProjectName.dproj /t:Helloยังล้มเหลว

ฉันพยายามแฮ็ค.dprojไฟล์เพื่อเพิ่มบรรทัด ...

<Import Project="Custom.targets"/>

การพิมพ์ดีดใช้MSBuild ProjectName.dproj /t:Helloงานได้แล้ว แต่ครั้งต่อไปที่ฉันบันทึกไฟล์โครงการจาก IDE <Import>คำสั่งจะถูกลบออก

ทุกคนมีความคิดว่ามีอะไรผิดปกติได้โปรด


10
ในตัวอย่างของการใช้ MSBuild จาก commandline ที่คุณแสดงCustom.targetในขณะที่ทุกคนที่คุณใช้Custom.targets มันคืออะไร
Kenneth Cochran

4
จุดที่ดี - ฉันไม่ได้สังเกตว่าแม้จะจ้องมองที่รหัสมาก ฉันไม่สามารถไปที่เครื่องที่มี Delphi อยู่ได้สองสามวัน (ในโรงพยาบาล!) แต่จะลองใช้รหัสโดยใช้ "เป้าหมาย" หรือ "เป้าหมาย" อย่างสม่ำเสมอเมื่อฉันทำได้
delphidabbler

6
ไม่ใช่ผู้ใช้ Delphi แต่ตามไฟล์. target ทั้งหมดนี้ ต้องมีสคริปต์ MSBuild ที่ถูกต้องโดยปราศจากข้อผิดพลาด หากไฟล์มีข้อผิดพลาดใด ๆ คุณจะได้รับแจ้งและหากโครงการอ้างอิงไฟล์. เป้าหมายที่ไม่ถูกต้องไฟล์นั้นจะถูกปิดการใช้งานและไม่สามารถเปิดใช้งานได้อีกครั้งจนกว่าข้อผิดพลาดจะได้รับการแก้ไข อาจคุ้มค่าการตรวจสอบทุกอย่างถูกต้องตามที่อธิบายถึงอาการที่คุณได้รับ
Daniel Morritt

น่าเสียดายที่ XE7 ฉันไม่สามารถทำซ้ำปัญหาของคุณได้ทุกอย่างดูเหมือนจะทำงานได้ตามที่คาดไว้: การสร้างจากพรอมต์บรรทัดคำสั่งด้วย/t:Helloเช่นเดียวกับจาก IDE ด้วยการคลิกขวาใน Project Manager - เป้าหมาย - สวัสดี ฉันเพิ่มลงCustom.targetsในโครงการโดยการคลิกขวาในตัวจัดการโครงการ - เพิ่ม - (เรียกดูไฟล์) พา ธ เป็นไดเร็กทอรีเดียวกันกับไฟล์. proj
Ondrej Kelle

คำตอบ:


1

Delphi สร้างเนื้อหา dproj ทั้งหมดเองและการนำเข้าที่กำหนดเองนี้จะถูกลบเสมอ

คุณสามารถเขียนไฟล์ msbuild xml ของคุณเอง แต่ dproj เป็นของ Delphi

หากคุณไม่มีซอร์สโค้ดหรือยินดีที่จะแก้ไขปัญหาที่คุณไม่สามารถทำได้

หากคุณต้องการวิธี xml ที่ยืดหยุ่นในการสร้างโครงการเดลฟายและสร้างเป้าหมายมากมายลองใช้ต้องการหรือต้องการ vnext (ส้อมของฉันบนบิตบูท)


1

ฉันจะรวมไฟล์เป้าหมายด้วยตนเองและสร้างภายนอกโดยใช้ MSBuild มากกว่าจาก IDE เพราะเมื่อรวบรวมจาก IDE มันค่อนข้างยุ่งเหยิงที่จะรู้ว่าคุณใช้การกำหนดค่าและเป้าหมายใดบ้าง เปิดใช้งานเป้าหมายหรือไม่คุณไม่ได้รับคำแนะนำแบบภาพใด ๆ ว่ามีการเปิดใช้งานเป้าหมายที่กำหนดเอง)

ฉันมักจะทำก่อนImport Project="$(BDS)\Bin\CodeGear.Delphi.Targets"ดังนั้นพวกเขาจะไม่แสดงใน IDE (มีอยู่ แต่ซ่อนอยู่กับผู้พัฒนา)

ตัวอย่างโครงการ Delphi 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>

ไฟล์. target ของฉันกำหนด "PropertyGroup" และ "Target" แบบกำหนดเองโดยมีเงื่อนไขดังนั้นจะใช้เมื่อเรียกจาก MSBuild เท่านั้น:

  <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

การใช้วิธีการนี้ช่วยให้คุณสามารถกำหนดเป้าหมายการสร้างเพื่อให้แน่ใจว่าทุกแอปพลิเคชันได้รับการตั้งค่าที่ถูกต้องโดยไม่ได้รับผลกระทบจากการเปลี่ยนแปลงที่เกิดขึ้นโดยใครก็ตาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.