2010-02-05 25 views
7

(Về cơ bản chúng tôi muốn nhập khẩu các tập tin mục tiêu ở một số nơi trong * file csproj và nếu không kiểm tra xem các tập tin theo tiêu chuẩn của chúng tôi)Tôi muốn tạo ra một công cụ thao tác C# dự án file

cách tốt nhất là gì làm điều này? Tôi đang có kế hoạch sử dụng C# và XDocument (LINQ to XML) và thao tác các nút. Nhưng đó là cách tốt nhất? Các lựa chọn thay thế khác có thể là:

  1. Tìm XSD cho csproj/msbuild và tạo đối tượng được nhập stronly đại diện cho tệp dự án. điều này có thể không?
  2. Có các công cụ/ngôn ngữ nào tốt hơn không (Có thể sử dụng điều này như một cái cớ để tìm hiểu Ruby). Một câu trả lời sẽ phải có một số liên kết đến các ví dụ để thao tác XML.

Có thể câu hỏi thực sự là: Cách tốt nhất để đọc và thao tác XML theo chương trình là gì?

+0

Tùy chọn tốt nhất của bạn là sử dụng một số loại tự động hóa VS. Bạn thực sự không nên rối tung với những tập tin đó trực tiếp. –

+5

@Moron: Tôi không hiểu tại sao không. Về cơ bản chúng là các tệp MSBuild. IMO toàn bộ * điểm * của chúng là XML (thay vì chúng là các tệp nhị phân mờ đục) là chúng có thể chỉnh sửa được. –

+1

@Jon Lý tưởng nhất là tôi sẽ không nói 'có thể chỉnh sửa'. Có thể đọc được, chắc chắn. Nhưng việc chỉnh sửa chúng có thể có vấn đề, khi họ nâng cấp lên phiên bản mới của VS. Trừ khi chúng ta đang nói những thay đổi thực sự đơn giản. – kprobst

Trả lời

5

Tôi cá nhân chỉ sử dụng LINQ to XML trực tiếp ... trừ khi bạn đang thực sự xử lý thực sự nặng, tôi không nghĩ sẽ đáng để tạo mô hình đối tượng cho nó. Chỉ cần bao nhiêu quy tắc/bất cứ điều gì bạn cần cho công cụ này?

+0

Điều này hoạt động tốt. Tôi đã làm điều này cho Ngôn ngữ lược đồ ánh xạ của Mô hình dữ liệu của thực thể, mà không lộ ra một API, và nó rất dễ dàng. – codekaizen

+0

Đã có một mô hình đối tượng cho điều này vì vậy tôi không thấy lý do tại sao một người dùng LINQ to XML thay thế. –

+0

@SayedIbrahimHashimi: Khi người ta không biết về mô hình đối tượng hiện có, và không muốn đi săn :) –

3

Chúng tôi có một công cụ trong nhà điều khiển các tệp dự án khi đang di chuyển để cập nhật các tham chiếu và đặt các thuộc tính khác nhau. Vì các tệp dự án không phức tạp nên chúng ta chỉ cần thao tác trực tiếp XML. Công cụ này được viết rất lâu trước khi LINQ có sẵn, vì vậy nó không sử dụng nó, nhưng tôi không thấy lý do gì khiến bạn không thể làm những gì Jon gợi ý.

Khi chúng tôi nâng cấp từ VS2005 lên VS2008, chúng tôi chỉ phải thực hiện những điều chỉnh nhỏ đối với mã, nhưng tất nhiên không có sự đảm bảo nào về vấn đề đó. Chúng tôi có thể phải thực hiện các điều chỉnh lớn hơn cho các phiên bản sau.

Nếu bạn quan tâm, có biết thêm một chút về công cụ của chúng tôi trong câu trả lời của tôi cho câu hỏi này Should a .sln be committed to source control?

+0

Chúng tôi cũng sử dụng hệ thống này cho các tệp dự án của mình. Dường như hoạt động tốt và không phụ thuộc VS, đó là một lợi thế cho máy xây dựng. – Pondidum

2

Theo phần thứ hai của câu hỏi của chúng tôi như thế nào để thao tác XML programatically, đây là một số xml từ một cấu hình dự án tập tin. (Web.config)

<system.web> 
<compilation debug="false"> 
<assemblies> 
     <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
     <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, 
</compilation> 
</compilation> 

và phân tích sử dụng LINQ-TO-XML, một cái gì đó như sau

XDocument assemblies = XDocument.Parse("web.config"); 

var projectAssemblies= from a in assemblies.Descendants("system.web\assemblies") 
       select new // What ever object you waant 
       { 
        Assembly = a.Attribute("assembly").Value.ToString(), 
        Version = a.Attribute("Version").Value.ToString(), 
        Culture = a.Element("Culture").Value.ToString(), 
        PublicKeyToken = a.Attribute("PublicKeyToken").Value.ToString() 
       }; 

foreach (var v in projectAssemblies) 
{ 
    // enjoy them 
} 

hy vọng nó sẽ giúp

5

MSBuild (mà là định dạng của tập tin dự án) có một số object model mà bạn có thể sử dụng cho các ứng dụng như thế này.

+0

Tôi nghĩ bạn đang đi đúng hướng. Nếu chỉ bạn đã cụ thể hơn về cách làm điều đó ... Có thể http://msdn.microsoft.com/en-us/library/microsoft.build.buildengine.project_members(VS.80).aspx? –

Các vấn đề liên quan