Mục tiêu xây dựng tùy chỉnh Delphi XE luôn bị vô hiệu hóa


177

Tôi đã tạo một .targetstệp MSBuild tùy chỉnh mà tôi đã đưa vào dự án Delphi XE thông qua IDE và kích hoạt nó từ menu ngữ cảnh của Trình quản lý dự án. Mặc dù tệp xác nhận, nó luôn bị vô hiệu hóa sau khi tôi lưu lại tệp dự án.

Đây là một phiên bản đơn giản hóa của tệp mục tiêu, được đặt tên Custom.targets.

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

Như một tập tin độc lập, nó hoạt động như mong đợi: gõ ...

MSBuild Custom.target /t:Hello

... tại dòng lệnh đưa ra thông báo mong đợi.

Thêm Custom.targetsvào một dự án Delphi thông qua IDE sẽ hiển thị tệp trong Trình quản lý dự án như mong đợi và .dprojtệp hiện chứa dòng ...

<TargetsFile Include="Custom.targets"/>

Tôi đã bấm chuột phải vào tệp trong Trình quản lý dự án của IDE và chọn Enable. Nhưng khi dự án được xây dựng, Buildcửa sổ thông báo sẽ hiển thị:

[Cảnh báo MSBuild] Custom.target (1): Bỏ qua quá trình nhập bị vô hiệu hóa: PathToProjectSource\\Custom.targets

Nhấp chuột phải một lần nữa trong Project Manager vẫn hiển thị Enabletùy chọn thay vì dự kiến Disable.

Tại dòng lệnh MSBuild ProjectName.dproj /t:Hellocũng thất bại.

Tôi đã thử hack .dprojtệp để thêm dòng ...

<Import Project="Custom.targets"/>

MSBuild ProjectName.dproj /t:Hellobây giờ hoạt động. Nhưng lần sau khi tôi lưu tệp dự án từ IDE, <Import>câu lệnh sẽ bị xóa.

Bất cứ ai có bất cứ ý tưởng những gì đang xảy ra xin vui lòng?


10
Trong ví dụ của bạn về việc sử dụng msbuild từ dòng lệnh bạn hiển thị Custom.target trong khi mọi nơi khác bạn sử dụng Custom.target . Đó là cái gì
Kenneth Cochran

4
Điểm tốt - Tôi đã không nhận thấy rằng mặc dù nhìn chằm chằm vào mã. Tôi không thể truy cập vào máy có Delphi trong vài ngày (trong bệnh viện!), Nhưng sẽ thử mã bằng cách sử dụng "mục tiêu" hoặc "mục tiêu" một cách nhất quán khi tôi có thể.
delphidabbler

6
Không phải là người dùng Delphi, nhưng theo điều này Tất cả các tệp .target phải chứa các tập lệnh MSBuild hợp lệ không có lỗi. Nếu tệp có bất kỳ lỗi nào, bạn sẽ được thông báo và, nếu dự án tham chiếu tệp .target không hợp lệ, nó sẽ bị vô hiệu hóa và không thể được bật lại cho đến khi các lỗi được sửa. Có thể đáng để kiểm tra lại mọi thứ là chính xác vì điều đó giải thích các triệu chứng bạn gặp phải.
Daniel Morritt

Thật không may trong XE7 Tôi không thể tái tạo vấn đề của bạn, mọi thứ dường như hoạt động như mong đợi: xây dựng từ dấu nhắc dòng lệnh /t:Hellocũng như từ IDE bằng cách nhấp chuột phải vào Trình quản lý dự án - Mục tiêu - Xin chào. Tôi đã thêm vào Custom.targetsdự án bằng cách nhấp chuột phải vào Trình quản lý dự án - Thêm - (duyệt qua tệp). Đường dẫn là cùng thư mục với tệp .dproj.
Ondrej Kelle

Câu trả lời:


1

Delphi tự tạo toàn bộ nội dung dproj và quá trình nhập tùy chỉnh này sẽ luôn bị xóa.

Bạn có thể viết các tệp xml msbuild của riêng bạn nhưng dproj thuộc về Delphi.

Trừ khi bạn có mã nguồn hoặc sẵn sàng để khỉ vá ide bạn không thể làm điều đó.

Nếu bạn thực sự muốn một cách xml linh hoạt để xây dựng các dự án delphi và tạo mục tiêu galore hãy thử hoặc muốn vnext (ngã ba của tôi trên bitbucket)


1

Tôi sẽ bao gồm tệp mục tiêu theo cách thủ công và xây dựng bên ngoài bằng MSBuild chứ không phải từ IDE, bởi vì khi biên dịch từ IDE, có một chút lộn xộn để biết bạn đã áp dụng cấu hình và mục tiêu nào (là cái được nhấp vào dự án? mục tiêu được kích hoạt? bạn không nhận được bất kỳ gợi ý trực quan nào cho thấy mục tiêu tùy chỉnh được bật).

Tôi thường làm điều đó trước khi Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets"chúng không hiển thị trên IDE (chúng tồn tại, nhưng bị ẩn cho các nhà phát triển).

Ví dụ, các dự án Delphi XE4 của tôi kết thúc bằng:

    <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>

Tệp .target của tôi xác định một "Nhóm tài sản" và "Mục tiêu" tùy chỉnh với một điều kiện, vì vậy chúng sẽ chỉ áp dụng khi được gọi từ 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>

Sau đó biên dịch nó với:

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

Sử dụng phương pháp này cho phép bạn tùy chỉnh các mục tiêu xây dựng để đảm bảo mọi ứng dụng đều có cài đặt chính xác mà không bị ảnh hưởng bởi những thay đổi do bất kỳ ai thực hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.