2011-01-20 33 views
16

Tôi có một dự án được xây dựng tốt trong VS 2008, và sau đó chúng tôi đã cài đặt và bắt đầu sử dụng TFS Build, và sau đó chúng tôi nâng cấp lên TFS 2010 Mọi thứ vẫn ổn và xây dựng chính xác (sau khi tôi thực hiện quy trình xây dựng mới của chúng tôi đã làm mọi thứ rất tốt đẹp chỉ với một cú nhấp chuột xây dựng bắt đầu từ bất kỳ ứng dụng khách Visual Studio 2010 từ xa nào). Visual Studio không cần phải được cài đặt trên Build Agent. Tôi đang cố gắng rất nhiều (rất khó) không cài đặt Visual Studio trên Tác nhân Xây dựng vì hiểu biết của tôi là không cần thiết và chúng tôi không được phép cài đặt nó trên máy không phát triển.Làm thế nào để xây dựng một dự án VSF010 MakeFile (vcxproj) với TFS Build (No VS 2010)

Bây giờ tôi đã thử nâng cấp giải pháp lên VS 2010, vẫn nhắm mục tiêu .NET 3.5 vì đây là một hội đồng được nhắm mục tiêu cho thủ tục CLR SQL Server và SQL Server không hỗ trợ .NET 4.0. Nhưng tôi chỉ đơn giản là không thể làm cho nó xây dựng nữa dưới TFS Build. Tôi dường như không thể nhận được một thông báo lỗi nhất quán từ TFS Build và từ dòng lệnh MS Build, nhưng tôi nghĩ nó có liên quan đến Microsoft.Cpp.Tác mục không nằm trong C: \ Program Files \ MSBuild \ bởi vì tôi đã cài đặt Visual Studio. Tôi đã cài đặt Microsoft Windows SDK 7.1 để tôi có thể chạy các công cụ .NET 4.0 SDK như svcutil cho một số dự án .NET 4.0 khác, nhưng không có gì có vẻ như cài đặt những gì xây dựng này muốn. Các lỗi TFS xây dựng mang lại cho tôi là:

C: \ TFSBld [...] \ GenerateLanguage \ GenerateLanguage.vcxproj (46,3): lỗi MSB4019: Dự án nhập khẩu "C: \ Microsoft.Cpp .Default.props "là không tìm thấy. Xác nhận rằng đường dẫn trong tuyên bố là chính xác, và tệp đó tồn tại trên đĩa.

Và khi tôi bấm vào lỗi mà nó đưa tôi đến dòng này trong file vcxproj:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 

Tất cả tôi thực sự cần phải làm gì trong dự án này được điều hành resgen để tạo ra các file nguồn lực từ các file resx và biên dịch chúng thành các hội đồng sattelite. Tôi đã sử dụng một makefile build để làm điều này, bằng tay chạy resgen (tôi nghĩ đó là vì tôi không thể tìm cách biên dịch các hội đồng sattelite như một giải pháp độc lập), và sau đó biên dịch chúng thành một DLL (I) không thể nhớ nó đã hoạt động như thế nào, nhưng tôi nghĩ rằng nó đã được chạy thủ công AL.exe để biên dịch các tệp DLL từ các tệp tài nguyên). Vì vậy, về cơ bản tôi chỉ cần chạy các dòng lệnh để xây dựng dự án này, và dường như tôi không thể tìm ra cách hợp lý để thực hiện nó mà không cần ném toàn bộ dự án và chỉnh sửa kịch bản lệnh xây dựng TFS để chạy một loạt các dòng lệnh được mã hóa cứng thay thế. Phải có một cách tốt hơn.

Tôi đã làm việc này cả ngày và đã cố gắng viết các tệp .targets tệp và .xml của riêng tôi để thay thế tệp chuẩn, nhưng trên đầu tôi. Tôi đã thử chỉ đơn giản là xóa các dòng, nhưng sau đó MSBuild phàn nàn rằng không có mục tiêu "Xây dựng". Tôi đã thử thêm một giả vào tập tin vcxproj, nhưng sau đó nó dường như không chạy các bước trước và sau xây dựng, nơi tất cả các công việc được thực hiện.

+0

Dường như câu hỏi này đã được trả lời tại đây: http://stackoverflow.com/questions/3043294/how-to-build-a-vs2010-c-project-on-a-buildserver Thế nào là cách chính xác để cập nhật/xóa câu hỏi này? – BlueMonkMN

Trả lời

15

Microsoft Windows SDK 7.1 có một số tùy chọn cài đặt. Chỉ có "Công cụ phát triển .NET" con "Công cụ" được kiểm tra dường như không đủ để xây dựng các dự án vcxproj, ngay cả khi chúng không bao gồm bất kỳ mã C++ nào (chỉ các bước trước và sau xây dựng). Thêm tùy chọn "trình biên dịch Visual C++" và chọn đầy đủ hộp kiểm "Intellisense and Reference Assemblies" cài đặt các tập tin và cài đặt cần thiết. Tôi không chắc chắn nếu cả hai là cần thiết, nhưng sự kết hợp đó đã làm việc cho tôi.

2

Tôi đã nghĩ ra một công việc phức tạp nhưng có chức năng xung quanh liên quan đến các bước sau.

  1. Sao chép các tệp này từ C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 trên hệ thống mà VS2010 được cài đặt - kiểm tra chúng vào kiểm soát nguồn để chúng được truy xuất như một phần của không gian làm việc:
    • Microsoft.Build.CPPTasks.Common.dll
    • Microsoft.BuildSteps.targets
    • Microsoft.Cl.Common.đạo cụ
    • Microsoft.Cpp.Default.props
    • Microsoft.Cpp.props
    • Microsoft.Cpp.targets
    • Microsoft.CppBuild.targets
    • Microsoft.CppCommon.targets
    • Microsoft.Link. Common.props
    • Microsoft.MakeFile.targets
    • Platforms \ Win32 \ Microsoft.Cpp.Win32.default.props
    • vBulletin s \ Win32 \ Microsoft.Cpp.Win32.props
    • Platfotms \ Win32 \ Microsoft.Cpp.Win32.targets
  2. Thay đổi các tập tin vcxproj để chỉ đường dẫn tương đối nơi workspace đặt các tập tin thay vì $ (VCTargetsPath).
  3. Thay đổi dòng (trong tất cả các tệp đó) để sử dụng thuộc tính AssemblyFile = "Microsoft.Build.CPPTasks.Common.dll" thay vì đề cập đến điều này bằng cách sử dụng thuộc tính AsssemblyName.
  4. Xóa "$ (VCTargetsPath) \" trong tệp ở gốc của vị trí mới để tìm tệp tin anh chị em của nó thay vì cố gắng tham chiếu đến macro VCTargetsPath không tồn tại. Bạn có thể tìm thấy các trường hợp mà bạn đã bỏ lỡ bằng cách cố gắng chạy một dòng lệnh xây dựng với MSBuild trên máy mà không có VS 2010 và nhìn vào các thông báo lỗi.
  5. Tương tự, thay thế $ (VCTargetsPath) trong tệp thư mục con bằng đường dẫn tương đối.
  6. Vào cuối tệp Microsoft.Cpp.Win32.targets, hãy nhận xét "< Mã VCMessage =" MSB8008 ".../>" dòng và sau đây liên quan < Nhập >.
  7. Dùng thử và báo lỗi, chạy xây dựng dòng lệnh và xem những điều khác tôi có thể quên đề cập đến. Tôi nghĩ đó là phần lớn.
1

Một cải tiến thay thế cho BlueMonkMN là thêm

<PropertyGroup> 
    <VCTargetsPath Condition="'$(VCTargetsPath)' == ''">[path_to_the_fileset_listed]</VCTargetsPath> 
</PropertyGroup> 

như một đứa trẻ cấp 1 gần phía trên cùng của vcxproj.

Đường dẫn có thể bao gồm biến môi trường hoặc một số đường dẫn nổi tiếng khác có chứa biến.

Điều này làm cho ít sự xâm nhập và dễ dàng hoàn nguyên hơn thay đổi nhiều dòng.

+1

Bạn vẫn không cần phải có những tệp Microsoft. * Ở đâu đó trên máy? – BlueMonkMN

+0

Có, các tệp phải ở đâu đó, nhưng vị trí có thể định cấu hình cao. Điều này rất hữu ích nếu bạn muốn toàn quyền kiểm soát các tệp, giữ chúng được kiểm tra và không làm xáo trộn các tệp gốc. – jesper

+0

Vậy bạn lấy các tệp ở đâu? Việc định cấu hình vị trí là vô dụng mà không có một số phương tiện để đưa các tệp đó vào các vị trí đó. – BlueMonkMN

0

Một thậm chí cách tiếp cận đơn giản hơn với việc thêm một biến môi trường cho VCTargetsPath:

  1. Xác định vị trí thư mục CPP Msbuild đề cập bởi BlueMonkMN
    • ví dụC:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120
  2. Mở Windows biến môi trường
    • Control Panel > System > Advanced Settings > Advanced > Environment Variables
  3. Thêm một biến người dùng mới với:
    • Tên: VCTargetsPath
    • Value: [đường dẫn của bạn để tiêu MSBuild từ bước 1 ]
  4. Khởi động lại Visual Studio.
  5. Xong. Dự án của bạn sẽ được xây dựng ngay bây giờ.
Các vấn đề liên quan