chỉ định tệp dự án của một giải pháp bằng cách sử dụng msbuild


116

Tôi muốn dòng lệnh để xây dựng một dự án cụ thể của một giải pháp bằng cách sử dụng msbuild giống như chúng ta làm với devenv.com. Trong devenv.com, chúng ta có thể chỉ định một dự án của một giải pháp bằng cách sử dụng dòng lệnh sau

devenv.com /Build Release|x86 test.sln /project "testproject"

Sử dụng dòng lệnh trên, tôi có thể xây dựng testproject trong test.sln bằng cách sử dụng devenv.com. Dòng lệnh cho msbuild là gì cho cùng một giải pháp.

Cảm ơn


Bất kỳ lý do gì bạn không chỉ chuyển testproject chính nó sang msbuild?
Mark Smith

2
Vì tôi không còn có thể chỉnh sửa nhận xét của mình. Ý tôi là tham khảo trực tiếp dự án thay vì giải pháp. "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith

thời gian khác nhau tôi phải xây dựng projects.using khác nhau devenv.com nó rất dễ dàng bằng cách xác định dự án của giải pháp mà
tjdoubts

Nếu đó là vấn đề duy nhất mà bạn gặp phải, bạn sẽ có thể sử dụng msbuild để xây dựng các dự án cần thiết vào đúng thời điểm. Bạn đã có các lệnh khác nhau mà bạn thực hiện vào các thời điểm khác nhau trên giải pháp, vậy tại sao không chỉ tham chiếu các dự án vào những thời điểm thích hợp với các lệnh msbuild khác nhau? Nếu các dự án của bạn được thiết lập đúng cách, chúng sẽ tìm ra tất cả các tham chiếu của chúng mà không cần sử dụng tệp sln.
Mark Smith

Câu trả lời:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Lưu ý rằng những gì được gán cho /tlà tên dự án trong giải pháp, nó có thể khác với tên tệp dự án.

Ngoài ra, như đã nêu trong Cách: Xây dựng các mục tiêu cụ thể trong các giải pháp bằng cách sử dụng MSBuild.exe :

Nếu tên dự án chứa bất kỳ ký tự %, $, @, ;, ., (, ), hoặc ', thay thế bằng một _nhân danh mục tiêu cụ thể.

Bạn cũng có thể xây dựng nhiều dự án cùng một lúc:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Để xây dựng lại hoặc làm sạch, hãy thay đổi /t:projectthành /t:project:cleanhoặc/t:project:rebuild


98
Một lưu ý quan trọng: nếu dự án của bạn có dấu '.' trong tên, bạn sẽ cần thay thế nó bằng '_' khi chỉ định nó bằng / t
Watusimoto

4
@easton Đối với việc xây dựng nhiều dự án, các synthax là cho msbuild tôi để lặp lại các /ttham số cho từng dự án để xây dựng:msbuild test.sln /t:project /t:project2
Philippe

46
Ngoài ra, nếu bạn đang sử dụng một thư mục giải pháp, bạn phải đặt trước tên dự án bằng tên thư mục và một dấu gạch chéo. Giống như @Watusimoto đã đề cập ở trên, nếu bạn có dấu chấm (.) Trong tên, bạn phải thay chúng bằng dấu gạch dưới (_). Tôi đã kết thúc với một cái gì đó như thế này: /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: Cũng có thể đáng nói rằng "thư mục giải pháp" không tham chiếu đến thư mục hệ thống tệp mà là một thư mục trong chế độ xem Giải pháp Explorer.
joshbodily

4
Tôi cũng phải thay thế '(' và ')' bằng '_' trong tên thư mục (các dự án do GYP tạo ra). Tôi đoán đó là tất cả các ký tự đặc biệt được thay thế bằng dấu gạch dưới.
Maxime Viargues 13/06/16

15

MSBuild thực sự hoạt động thông qua việc sử dụng các dự án không phải là giải pháp. Giải pháp chỉ được sử dụng để phân tích cú pháp thành tệp dự án tạm thời trong MSBuild trong nội bộ. Bạn có thể chỉ cần xây dựng dự án quan tâm trực tiếp thông qua MSBuild bằng cách thực hiện lệnh sau.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Có một vấn đề lớn mà tôi biết bạn có thể gặp phải khi sử dụng dự án trực tiếp thay vì giải pháp: nếu bạn sử dụng giải pháp để thể hiện sự phụ thuộc giữa các dự án, thay vì thêm các tham chiếu đến dự án và để hệ thống xây dựng tự động giải quyết các phụ thuộc .

Nếu bạn đang thực thi lệnh xây dựng bằng cách sử dụng tệp sln, tôi khuyên bạn nên làm việc trực tiếp các phần phụ thuộc đó vào tệp proj và xóa chúng khỏi sln. Điều này sẽ cho phép bạn gọi trực tiếp bất kỳ tệp proj nào từ MSBuild và tất cả các dự án sẽ được xây dựng độc lập mà không cần thực hiện thêm bất kỳ công việc nào. Bạn thực sự nên coi tệp sln như một nhóm dự án để làm việc trong Visual Studio dễ dàng hơn chứ không phải là đầu vào xây dựng.


4
Vui lòng chỉ ra cách có thể thực thi thứ tự xây dựng từ các tệp proj. Cảm ơn.
ProgramCpp

4
Đây là một vấn đề khác với việc sử dụng trực tiếp tên dự án. Ví dụ, bạn có 5 dự án trong giải pháp của mình. Một số dự án có cấu hình DebugPro và các dự án khác không có cấu hình đó. Nếu bạn xây dựng một dự án với cấu hình mà tất cả các dự án có mọi thứ đều là tệp nhưng chỉ tệp giải pháp mới biết cấu hình dự án nào sẽ sử dụng cho mỗi dự án nếu bạn chọn cấu hình giải pháp DebugPro.
Alex

@ProgramCpp Khi bạn thêm tham chiếu từ dự án này sang dự án khác, nó sẽ tự động tìm ra rằng dự án được tham chiếu cần phải xây dựng trước.
jpaugh

Một nhược điểm khác của phương pháp này là đường dẫn tương đối trong dự án được giải quyết so với tệp giải pháp. Khi bạn xây dựng dự án trực tiếp, đường dẫn tương đối sẽ thay đổi. Đầu ra có thể ở nơi khác và các bài kiểm tra đơn vị có thể tra cứu các thư mục sai.
Tomas Kubes

Vấn đề cũng có thể xuất hiện nếu bạn sử dụng các biến giải pháp trong cấu hình dự án, như $ (SolutionDir)
Alex Che

8

Đăng dưới dạng thông tin cho những người tìm kiếm trong tương lai

Thêm phần sau vào tập lệnh xây dựng và chạy nó một lần. Điều này sẽ tạo ra các mục tiêu chính xác và thông tin khác mà msbuild sẽ thực sự sử dụng.

Ví dụ: Nếu bạn có .trong tên dự án hoặc các thư mục, msbuild sẽ mong đợi _ở vị trí của ..

set MSBuildEmitSolution=1

Sau khi nhận được thông tin, hãy cập nhật kịch bản xây dựng với các chi tiết cần thiết.


6
Nếu bạn có '.' trong tên dự án hoặc các thư mục msbuild sẽ mong đợi '_' thay cho '.'. '
dhcgn

2

Để làm được điều này, bạn cần biết tên mục tiêu của dự án là gì, không nhất thiết phải biết tên dự án.

Một cách để tìm ra điều này là sử dụng MSBuild chống lại SLN của bạn với các tham số dự định sau khi thiết lập một biến môi trường đặc biệt được gọi là MSBuildEmitSolutiongiá trị của 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Gần đây tôi đã phải làm điều này do tên rất cụ thể cho một mục tiêu trong các thư mục lồng nhau. Vì vậy, từ tệp đã tạo của tôi, my_stuff.sln.metaprojtôi tìm thấy dòng này:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Điều đó có nghĩa là dòng lệnh sử dụng cuối cùng là

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
Đây là những gì tôi cần. Gợi ý nếu bạn không muốn chạy điều này: mục tiêu của bạn là cấu trúc thư mục từ đường dẫn hiện tại đến tệp dự án của bạn, trừ đi phần mở rộng tệp dự án ( .csprojtrong trường hợp của tôi). TÔI <3 VẬY!
Không hoàn lại tiền Không trả lại

1

Chỉ để thêm thông tin bổ sung, thực thi msbuild trong thư mục dự án theo mặc định sẽ tạo tệp dự án vì tệp duy nhất ở đó.

>msbuild

Có nhiều biến thể của việc sử dụng msbuild theo cách này. Bạn có thể chỉ định tệp proj trực tiếp.

>msbuild helloworld.csproj -t:Build.

Xem lại tài liệu msbuild để biết cách sử dụng, yêu cầu tệp proj cũng như lợi ích của việc xây dựng dự án thay vì giải pháp.

Tài liệu MS MSBuild

Có những lợi ích khi xây dựng theo cách này như đã được đề cập ở trên bởi mark-smith.

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.