2012-01-17 14 views
19

Tôi có một giải pháp với hai dự án thực thi.App.config cho dự án con không được sao chép sang đầu ra

Main.exe phụ thuộc vào Subordinate.exe.

Các dự án này đều có App.config tệp, vì vậy trong các thư mục đầu ra tương ứng, tôi có Main.exe.configSubordinate.exe.config.

Khi tôi xây dựng Main.exe, Subordinate.exe được sao chép vào thư mục đầu ra của Chính, nhưng Subordinate.exe.config thì không.

Có cách nào tiêu chuẩn để yêu cầu Visual Studio thực hiện việc này không?

+2

Một phương pháp khác là để chỉnh sửa các tập tin csproj cho dự án phụ huynh và sử dụng AllowedReferenceRelatedFileExtensions trong một propertygroup. Trong trường hợp của bạn, bạn sẽ thêm .exe.config vào danh sách các phần mở rộng được cho phép. Xem: https://stackoverflow.com/questions/9765686/include-referenced-projects-config-file/9769667#9769667 –

Trả lời

10

Nhấp chuột phải vào dự án Main và chọn Edit Project File. Thêm sự kiện AfterBuild:

<Target Name="AfterBuild"> 
    <Copy SourceFiles="..\Subordinate\bin\$(Configuration)\Subordinate.exe.config" 
      DestinationFolder="$(TargetDir)" /> 
    </Target> 
+0

Tôi đã thử điều này, bằng cách sử dụng 'PostBuildEvent', và thấy rằng nó đã thất bại trong nỗ lực đầu tiên để xây dựng , rồi thành công trong lần thử thứ hai. Hóa ra trong dự án * thực * của tôi, dự án cấp dưới không được liệt kê là phụ thuộc của dự án chính, do đó nó được xây dựng sau dự án chính. Khi tôi đã thiết lập sự phụ thuộc một cách chính xác, sự kiện xây dựng bài đăng đã hoạt động.** - ** Dù sao, tôi đã hy vọng cho một câu trả lời mà không yêu cầu một AfterBuild/PostBuildEvent, nhưng cho rằng không có gì sắp tới, tôi đánh dấu đây là câu trả lời (vì đó là những gì tôi đã làm). – Mud

+1

Tôi muốn tránh 'PostBuildEvent' bằng mọi giá. 'AfterBuild' là thích hợp hơn vì nó ít được xây dựng và kiểm soát. – KMoraz

+0

Tôi chỉ muốn thêm điều đó vào VS2012, macro cho cấu hình (ví dụ: Gỡ lỗi/Phát hành) là $ (ConfigurationName), không phải $ (Cấu hình). Ngoài ra, bạn có thể cần bao gồm đặc tả nền tảng (ví dụ: x86/x64). Bạn có thể cần phải viết nó như sau:

14

Một cách khác tôi tìm thấy là thêm tệp app.config dưới dạng tệp được liên kết vào dự án phụ thuộc, ví dụ: ở đây bạn sẽ thêm một liên kết đến app.config của Subordinate.exe vào dự án của Main.exe, và thiết lập nó để được sao chép vào thư mục đầu ra khi được xây dựng. Sau đó bạn có thể thay đổi tên của tập tin được sao chép vào thư mục đầu ra main.exe tại thời gian xây dựng bằng cách chỉnh sửa các yếu tố <Link> trong hồ sơ dự án của bạn, một cái gì đó như:

<None Include="..\Subordinate.ProjectFolder\app.config"> 
    <Link>Subordinate.exe.config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</None> 

này có cùng một vấn đề mà bạn phải hardcode tên của tập tin cấu hình được tạo ra, nhưng đó không phải là tồi tệ hơn cách tiếp cận AfterBuild, và tôi thấy phương pháp này minh bạch hơn một chút, và nó loại bỏ vấn đề phụ thuộc xây dựng theo thứ tự mà bạn đã đề cập.

+1

Có cách nào để làm cho tệp xuất hiện cùng tên với liên kết không? – Zee

+0

Giải pháp tốt nhất vì giải pháp được chấp nhận không hoạt động trên kịch bản Build Server :) – suryakiran

1

Hãy xem this answer (dựa trên công việc của @theyetiman). Nó đòi hỏi chủ yếu là một sửa đổi của dự án, các tập tin app.config thuộc về. Các dự án tiêu thụ không được sửa đổi.

<ItemGroup> 
    <None Include="app.config" /> 
</ItemGroup> 
<ItemGroup> 
    <None Include="app.config"> 
    <Link>$(TargetFileName).config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
</ItemGroup> 

Cũng lưu ý rằng với Visual Studio 2017, sửa đổi này không cần thiết nữa. Nếu bạn mở giải pháp với dự án có giải pháp trên, cảnh báo tương tự như sau được hiển thị trong cửa sổ lỗi:

Không thể thêm tệp 'app.config' vào dự án. Không thể thêm liên kết vào tệp ... \ app.config. Tệp này nằm trong cây thư mục dự án.

Thêm một điều kiện so sánh $(VisualStudioVersion) để tránh cảnh báo này và giữ cho khả năng tương thích ngược:

<ItemGroup> 
    <None Include="app.config" /> 
</ItemGroup> 
<ItemGroup Condition="'$(VisualStudioVersion)' &lt; '15.0'"> 
    <None Include="app.config"> 
    <Link>$(TargetFileName).config</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </None> 
</ItemGroup>