2009-03-07 30 views
32

Tôi có một giải pháp chứa một số dự án C# và tôi muốn có thể đặt đường dẫn đầu ra và các thuộc tính khác trên tất cả các dự án cùng nhau ở một nơi. Trang thuộc tính (vsprops) dường như không khả dụng cho các dự án C# và biến $ (SolutionDir) bị bỏ qua. Có phương pháp nào khác để thiết lập các thuộc tính trên một số dự án C# không?Cách thiết lập đường dẫn đầu ra của một số dự án C# trực quan

Cập nhật Bằng Sau khi thông tin trong câu trả lời của Bas Bossink tôi đã có thể thiết lập các đường dẫn đầu ra của một số dự án bằng cách tạo ra một csproj chung và nhập khẩu nó vào dự án cá nhân. Một vài điểm khác:

  • Khi xây dựng trong Visual Studio nếu cần thay đổi dự án chung, cần phải chạm/tải lại bất kỳ dự án nào tham chiếu để thay đổi được chọn.
  • Bất kỳ thuộc tính nào cũng được đặt trong một dự án riêng lẻ sẽ ghi đè các thuộc tính chung.
  • Đặt $ (SolutionDir) làm đường dẫn đầu ra qua giao diện người dùng Visual Studio không hoạt động như mong đợi vì giá trị được coi là chuỗi ký tự thay vì mở rộng. Tuy nhiên, thiết lập $ (SolutionDir) trực tiếp vào tệp csproj với một trình soạn thảo văn bản hoạt động như mong đợi.
+5

Viên đạn thứ ba thực sự đã lưu ngày của tôi ở đây. Cảm ơn bạn đã đăng thông tin này tại đây. –

Trả lời

35

Tệp csproj đã là tệp msbuild, điều này có nghĩa là tệp csproj cũng có thể sử dụng phần tử nhập như được mô tả here. Phần tử nhập là chính xác những gì bạn yêu cầu. Bạn có thể tạo một Common.proj có chứa một cái gì đó như:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5"xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup> 
    <OutputPath>$(SolutionDir)output</OutputPath> 
    <WarningLevel>4</WarningLevel> 
    <UseVSHostingProcess>false</UseVSHostingProcess> 
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors> 
</PropertyGroup> 
</Project> 

Bạn có thể nhập Common.proj này trong mỗi csprojs của bạn, ví dụ như vậy:

<Import Project="..\Common.proj" /> 

Những tuyên bố nhập khẩu nên trước bất kỳ các tác vụ phụ thuộc vào các thuộc tính được xác định trong Common.proj

Tôi hy vọng điều này sẽ hữu ích. Tôi không thể xác nhận vấn đề của bạn với biến $ (SolutionDir) mà tôi đã sử dụng nhiều lần. Tuy nhiên, tôi biết rằng biến này không được thiết lập khi bạn chạy một lệnh msbuild thông qua dòng lệnh trên một dự án cụ thể được chứa trong một giải pháp. Nó sẽ được thiết lập khi bạn xây dựng giải pháp của bạn trong Visual Studio.

+1

Điều đáng nói đến $ (SolutionDir) không được đặt từ giao diện người dùng Visual Studio, nhưng sử dụng trình soạn thảo văn bản. Xem @paul chỉnh sửa. –

+1

Cũng đáng nhắc đến, rằng đối với mỗi thuộc tính bạn đặt trong common.proj, bạn cũng phải XOÁ khỏi tệp có chứa nó. –

0

Tôi khuyên bạn nên sử dụng công cụ xây dựng như MSBuild hoặc NAnt, điều này sẽ giúp bạn linh hoạt hơn trong các bản dựng của mình. Về cơ bản, ý tưởng là khởi chạy một bản dựng bằng cách sử dụng (trong hầu hết các trường hợp) một tệp xây dựng có thể cấu hình duy nhất.

Cá nhân tôi sẽ giới thiệu NAnt.

Bạn có thể tìm thấy một hướng dẫn tuyệt vời trên Nant trên blog của JP Boodhoo của here

+0

MSBuild là những gì bạn nên sử dụng. Tôi thứ hai sử dụng MSBuild. NAnt, mặt khác đã không được cập nhật từ năm 2012, và có vẻ như đã chết. –

1

Thật không may, những bit thông tin như đường dẫn đầu ra đều được lưu trữ bên trong cá nhân * file csproj. Nếu bạn muốn cập nhật hàng loạt toàn bộ nhóm, bạn sẽ phải hoàn nguyên về một số công cụ cập nhật văn bản hoặc tạo tập lệnh để chạm vào từng tệp đó.

Đối với những thứ như thế này (áp dụng thay đổi cho một loạt tệp văn bản cùng một lúc) Cá nhân tôi sử dụng WildEdit bởi Phần mềm Helios - hoạt động như một sự quyến rũ và giá cả hợp lý.

Nhưng tôi chắc chắn cũng có rất nhiều lựa chọn thay thế miễn phí.

+0

Một tìm kiếm đơn giản và thay thế bằng một trình soạn thảo văn bản yêu thích cũng sẽ hoạt động. –

+0

@CJohnson: nếu bạn có một, hai hoặc thậm chí năm tệp để làm việc trên - có. Nếu bạn có 150, 250, hoặc nhiều hơn - không quá nhiều nữa ..... –

0

Đặt thuộc tính $(OutputPath) trong trang thuộc tính chung. Sau đó xóa mục nhập đó trong tất cả các tệp dự án mà bạn muốn nó ảnh hưởng. Sau đó nhập trang thuộc tính đó vào tất cả các dự án của bạn.

Đối với hàng trăm dự án có thể rất tẻ nhạt. Đó là lý do tại sao tôi đã viết một công cụ để trợ giúp việc này:

https://github.com/chris1248/MsbuildRefactor

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