2012-04-18 18 views
8

Có thể chỉ định một thư mục khác cho đầu ra của tệp sau không?Tôi có thể chỉ định đường dẫn đầu ra cho thẻ MSBuild <Content> không?

<Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
+0

bạn đã tìm ra cách thực hiện? –

+0

Chưa, xin lỗi. – abenci

+1

Liên kết này không hiển thị cách chỉ định một thư mục khác với thẻ Nội dung nhưng có vẻ như một giải pháp thay thế có thể cho phép bạn thực hiện những gì bạn muốn ... http://stackoverflow.com/questions/7643615/how-can- i-get-msbuild-to-copy-all-files-được đánh dấu-as-content-to-a-folder-preservin –

Trả lời

5

Bạn có thể, nhưng không phải với 'Nội dung'. Nó phụ thuộc vào nhiệm vụ mục, nhưng hầu hết các tác vụ được tích hợp sẵn mà bạn có thể tấn công, không đáng bị rắc rối hoặc tác dụng phụ.

Có một con đường mòn cơ bản để xử lý vấn đề này :) Việc này cũng tránh được cách shell PostBuild khó chịu nếu bạn đang thực hiện .Net và sử dụng quy trình xây dựng actuall.

Tôi không thấy bất kỳ câu trả lời nào khác như thế này, sử dụng strieght lên MSBuild, nơi tôi nghĩ rằng trái tim của câu hỏi OPs là. Đây là khái niệm cốt lõi và đường đi ngắn nhất, tìm kiếm một loại mục có tham số đường dẫn 'tương đối so với outputpath' không có tác dụng phụ.

1) Post Process Kiểu:

<ItemGroup> 
    ... 
    <MyTargets Include="test.stl"/> 
    ... 
</ItemGroup> 

Sau đó ở phía dưới (sử dụng bất cứ điều gì con đường bạn đang sau):

<PropertyGroup> 
    <MyDeployDir>$(SolutionDir)$(Configuration)</MyDeployDir> 
    <MyOtherDeployDir>$(SolutionDir)$(Configuration)\Templates</MyDeployDir> 
</PropertGroup> 

Sau đó hiện MS xây dựng của bạn bao gồm (không thêm này, ở đây dưới dạng điểm đánh dấu):

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

Sau đó, 'Sau khi xây dựng':

<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(MyTargets)" DestinationFolder="$(MyDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyOtherTargets)" DestinationFolder="$(MyOtherDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyTargets2)" DestinationFolder="$(MyDeployDir)\IHeardYourMomLikesGrapeNuts" SkipUnchangedFiles="true" /> 
</Target> 

Vấn đề fundemental là dự án hạng mục không làm bất cứ điều gì theo mặc định, họ có một loại như 'nội dung' hoặc 'MyTarget'. Những loại đó nói lên điều gì sẽ xảy ra. Bạn có thể tìm thấy một nhiệm vụ, hoặc gõ, hoặc xây dựng kịch bản bao gồm có những gì bạn muốn, nhưng không có gì nội tại về một mục trong một nhóm item như xa như những gì sẽ xảy ra với tập tin đó trong quá trình xây dựng. Ở trên là một sự cân bằng giữa sức mạnh của một 'nhiệm vụ' được xây dựng đặc biệt nhưng với tất cả các rắc rối.

Khi bạn thêm

<ItemGroup> 
    <MyOutFiles Include="xxx.xxx" /> 

một thời gian để hồ sơ dự án, nó sau đó sẽ xuất hiện trong danh sách BuildAction cho bất kỳ tập tin, nơi bạn có thể đặt trên bất kỳ tập tin mà không cần phải chỉnh sửa các tập tin Proj bằng tay.


2) Trong một bước

Trong các phiên bản sau này của MSBuild bạn có thể nhúng một 'ItemGroup' bên trong mục tiêu 'AfterBuild' và làm các việc trên hoặc làm những việc ưa thích khác mà không cần chạm vào phần còn lại của tập tin . Điều này cho phép ví dụ lấy kết quả của việc xây dựng bằng cách sử dụng một Bao gồm đơn giản và thay thế nó ở một nơi khác. Đây là tất cả mà không làm RoboCopy bất cứ điều gì hoặc viện đến việc xử lý chức năng mục tiêu xây dựng phức tạp hơn.

<Target Name="AfterBuild"> 
    <ItemGroup> 
    <MyOutFiles Include="$(OutDir)*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyOutFiles)" DestinationFolder="$(SolutionDir)\Application" SkipUnchangedFiles="true" /> 

Chỉnh sửa (do bỏ phiếu xuống?, áp phích nhận xét kể từ khi bị xóa):

Để phân biệt các phương pháp có thể và để nhắc lại, phương pháp này không sử dụng các chức năng của MSBuild hoặc các tác vụ thay thế như 'RoboCopy' nhưng được sử dụng để hiển thị phong cách MSBuild tinh khiết hơn bằng chức năng cốt lõi như người ta sẽ sử dụng trong việc tạo ra các nhiệm vụ mục như 'Nội dung'.

Câu hỏi là tôi có thể chỉ định 'thư mục differnt cho tệp sau' và tôi có thể làm điều này cho thẻ nội dung không. Bạn có thể định tuyến lại tất cả các BuildAction sử dụng các hàm MSBuild, tuy nhiên tôi không tin rằng đó là câu hỏi.

Bạn có thể làm điều này là một bước như được hiển thị ở trên, vì vậy tôi không nghĩ rằng đây là bất kỳ phức tạp hơn và tin rằng nó dễ đọc hơn. Dưới đây là hình thức ngắn, và cho phép anh ta tạo BuildAction của riêng mình mà có thể được xử lý dù sao anh ta muốn. Vì vậy, không, bạn không thể nói 'Nội dung' để chọn thư mục khác cho một tệp cụ thể được đánh dấu là 'Nội dung', nhưng bạn có thể tạo một hành động xây dựng khác hoạt động khá dễ dàng. Bạn cũng có thể tiêm thông tin meta vào thẻ StlFiles để điều khiển hành động, bạn có thể đặt nó trên chính thẻ hoặc có móc StlFiles sớm hơn trong quá trình như nội dung, nhưng điều đó phức tạp hơn.

<StlFiles Include="test.stl" />   
... 
<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(StlFiles)" DestinationFolder="$(SolutionDir)\Release\MyTypes" SkipUnchangedFiles="true" /> 
+0

Câu trả lời là không sai, nó hoạt động.Liên kết được cung cấp cho thấy một cách khác với việc sử dụng các chức năng tập lệnh, mà tôi đặc biệt tránh được, như tránh tác vụ RoboCopy. Liên kết cung cấp truyền tất cả nội dung đến một địa điểm, điều này thực hiện một tệp. Anh ta yêu cầu một tập tin. Câu hỏi đặt ra là: một nhiệm vụ mục có thể sử dụng một đường dẫn đầu ra thay thế hay không. Câu trả lời là có và không, 'nội dung' không thể nhưng các nhiệm vụ khác có thể, nhưng đây là một cách để làm cho một mà bạn có thể kiểm soát. – Celess

+0

Có một nhận xét ở trên bình luận đầu tiên của tôi, dường như đã bị xóa; chỉ cần nói ... vì vậy trên không có vẻ ngẫu nhiên. Đó là một bình luận bỏ phiếu xuống mà tôi đã trả lời, và tại sao phần chỉnh sửa tồn tại trong câu trả lời. Các nhận xét mà thiếu bây giờ là khá mạnh mẽ worded, một cái gì đó để ảnh hưởng của "xuống bỏ phiếu do không chỉ là câu trả lời này là sai, nhưng làm cho một cái gì đó đơn giản phức tạp hơn nhiều so với nó cần phải được" của BitwiseMan. – Celess

+0

Liên kết mà anh ta tham chiếu là: http://stackoverflow.com/questions/7643615/how-can-i-get-msbuild-to-copy-all-files-marked-as-content-to-a-folder-preservin – Celess

0

Không có cách nào để chỉ định thư mục đầu ra bổ sung AFAIK, nhưng bạn có thể sao chép tệp trước hoặc sau khi tạo.

0

Chức năng này không được tích hợp vào mục Nội dung. Nhưng bạn có thể tack nó bằng cách thêm một mục tiêu vào tập tin dự án của bạn.

Trong dự án của bạn, bạn hiện có này:

<ItemGroup> 
    <Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

Giả sử bạn muốn điều đó một tập tin cụ thể sao chép vào một vị trí khác nhau, thêm video này vào cuối cùng (trước khi bế mạc "Dự án" tag):

<Target Name="CopyStl" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target> 

Nếu bạn muốn thêm một vài tác phẩm hơn để sao chép vào cùng một thư mục, hãy thử này để thay thế:

<Target Name="CopySomeFiles" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target 
0

Một thư mục đầu ra khác nhau có thể được xác định bằng cách sử dụng siêu dữ liệu Link trên None/Content mục:

<Content Include="test.stl"> 
    <Link>some\folder\%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

Khi sử dụng ký tự đại diện trong một tuyên bố bao gồm, đây cũng là cách để bảo vệ hệ thống phân cấp thư mục, ngay cả đối với các file đến từ bên ngoài thư mục dự án:

<Content Include="..\shared\**\*"> 
    <Link>some\folder\%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

Trong các dự án SDK dựa trên (mặc định cho các dự án ASP.NET Core/NET Core/NET tiêu chuẩn) sử dụng một SDK 2.0.0+, cùng có thể đạt được bằng cách sử dụng LinkBase siêu dữ liệu:

<Content Include="..\shared\**\*" LinkBase="some\folder" CopyToOutputDirectory="PreserveNewest" /> 
Các vấn đề liên quan