Sao chép tệp vào thư mục ứng dụng tại thời điểm biên dịch


95

Nếu tôi có một số tệp muốn sao chép từ dự án của mình vào .\bin\debug\thư mục biên dịch, thì có vẻ như tôi phải đặt chúng vào thư mục gốc của dự án. Đặt chúng vào một thư mục con dường như sao chép chúng vào .\bin\debug\thư mục theo cùng cấu trúc mà chúng được lưu trữ.

Có cách nào để tránh điều này?

Chỉ cần nói rõ: nếu tôi có MyFirstConfigFile.txtMySecondConfigFile.txttrong một ConfigFilesthư mục và tôi đặt Bản sao của chúng thành Đầu ra thành Bản sao ... , thì chúng sẽ xuất hiện trong .\bin\debug\ConfigFiles\thư mục. Tôi muốn chúng xuất hiện trong .\bin\debug\thư mục.

Câu trả lời:


93

Bạn có thể làm điều này với một sự kiện xây dựng bài đăng. Đặt tệp thành không có tác vụ biên dịch, sau đó trong macro sao chép tệp vào thư mục bạn muốn.

Đây là một Macro xây dựng bài đăng mà tôi nghĩ sẽ hoạt động bằng cách sao chép tất cả các tệp trong thư mục có tên là Cấu hình vào thư mục xây dựng gốc:

copy $(ProjectDir)Configuration\* $(ProjectDir)$(OutDir)

1
Đối với đích, nó phải là $ (ProjectDir) \% (OutDir)?
Ed Greaves

11
Macro chính xác và đã được kiểm tra (Vs2010) là: copy "$ (ProjectDir) Firebird \ firebird_bin *" "$ (ProjectDir) $ (OutDir)"
Eric Bole-Feysot 12/10/12

Bạn cũng có thể tạo một tệp tương đối cho đầu ra: sao chép "$ (ProjectDir) Firebird \ firebird_bin *" "$ (OutDir)"
Elendurwen

3
Tôi nghĩ rằng việc sử dụng dấu ngoặc kép là cần thiết:copy "$(ProjectDir)subfolder_name\"* "$(ProjectDir)$(OutDir)"
tedebus

1
Trong MSVS2017 (15.4), nó sẽ chỉ được $(OutDir)(tức là không $(ProjectDir)) có vẻ như ... else bạn nhận được lỗi đường đôi
JHBonarius

51

Bạn có thể sử dụng một tác vụ MSBuild trên csproj của mình, như vậy.

Chỉnh sửa tệp csproj của bạn

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(OutputPath)yourfiles" DestinationFolder="$(YourVariable)" ContinueOnError="true" />
  </Target>

Đây là giải pháp tốt nhất vì bạn có thể sử dụng ký tự đại diện để sao chép nhiều tệp và chúng không cần phải có trong dự án.
Chris Bordeman

37

Bạn cũng có thể đặt các tệp hoặc liên kết vào thư mục gốc của trình khám phá giải pháp và sau đó đặt các thuộc tính tệp:

Build action = Content

Copy to Output Directory = Copy if newer (ví dụ)

Để có liên kết, kéo tệp từ trình khám phá cửa sổ vào trình khám phá giải pháp, giữ phím shift và điều khiển.

nhập mô tả hình ảnh ở đây


3
Điều này sẽ bảo toàn đường dẫn tương đối ban đầu, không được chấp nhận đối với OP
jlee

Nếu bạn đặt tệp vào nút cấp cao nhất của dự án, thì tệp sẽ được sao chép trực tiếp vào thư mục đầu ra $ (OutputPath).
Georg

4

Cá nhân tôi thích cách này hơn.

Sửa đổi .csprojđể thêm

<ItemGroup>
    <ContentWithTargetPath Include="ConfigFiles\MyFirstConfigFile.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <TargetPath>%(Filename)%(Extension)</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>

1
Theo tôi cách tốt hơn là một sự kiện hậu xây dựng sự kiện. Cảm ơn bạn!
khlr

Điều này không giống với việc nhấp chuột phải vào dự án và chọn "Thêm | Mục hiện có" từ Giải pháp Explorer, sau đó đặt thuộc tính Tệp "Sao chép vào Thư mục đầu ra" thành "Sao chép nếu mới hơn". Không cần phải sửa đổi trực tiếp XML.
Antony Booth

@AntonyBooth sau một thời gian, bạn sẽ nhận ra rằng việc hiểu những gì đang xảy ra và sửa đổi mã trực tiếp luôn dễ dàng hơn là học cách làm điều tương tự với IDE của bạn. Hôm nay bạn đang sử dụng Visual Studio, ngày mai có thể là JetBrains Rider và ngày mốt VS Code. Cuối cùng, bạn luôn thành thạo một ngôn ngữ hơn là IDE. Tái bút: Tôi không biết những gì bạn mô tả có giống nhau không vì tôi chỉ biết cách làm điều đó trong XML, tốt hơn nhiều như thế này.
Jérôme MEVEL

3

sao chép từ thư mục con sang thư mục con

 if not exist "$(ProjectDir)$(OutDir)subfolder" mkdir "$(ProjectDir)$(OutDir)subfolder"

 copy "$(ProjectDir)subfolder\"  "$(ProjectDir)$(OutDir)subfolder\"

7
Chào mừng bạn đến với StackOverflow và cảm ơn bạn đã đóng góp. Bạn đã trả lời một câu hỏi thực sự cũ đã có một loạt câu trả lời được ủng hộ cao. Nếu bạn cho rằng câu trả lời của mình hữu ích ngoài những câu trả lời được ủng hộ hiện có, bạn nên thêm một chút giải thích tại sao câu trả lời của bạn giải quyết được vấn đề và tại sao nó tốt hơn / khác với những câu khác.
Matthijs Wessels

1

Bạn muốn sử dụng sự kiện Post-Build trong dự án của mình. Bạn có thể chỉ định đầu ra ở đó và có các giá trị macro cho những thứ thường được sử dụng như đường dẫn dự án, tên mục, v.v.


0

Bạn có thể sử dụng sự kiện PostBuild của dự án. Sau khi quá trình xây dựng hoàn tất, bạn có thể chạy tệp loạt DOS và sao chép các tệp mong muốn vào thư mục mong muốn của mình.


0

Tôi tìm thấy câu hỏi này khi tìm kiếm "sao chép tệp vào thư mục ứng dụng tại thời điểm biên dịch". OP dường như đã sắp xếp điều này rồi, nhưng nếu bạn không:

Trong Visual Studio, bấm chuột phải vào tệp, chọn thuộc tính, sau đó thay đổi tùy chọn 'sao chép để xuất' thành 'luôn luôn'. Xem http://msdn.microsoft.com/en-us/library/0c6xyb66.aspx


5
OP yêu cầu sao chép vào thư mục biên dịch mà không giữ cấu trúc thư mục tương đối của các vị trí tập tin sao chép
Axel Costas Pena
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.