Sự kiện xây dựng bài đăng của Visual Studio - Sao chép vào vị trí thư mục tương đối


228

Khi xây dựng thành công, tôi muốn sao chép nội dung của thư mục đầu ra sang một vị trí khác trong cùng thư mục "cơ sở" . Thư mục mẹ này là một phần tương đối và có thể thay đổi dựa trên cài đặt Kiểm soát nguồn.

Tôi đã liệt kê một vài giá trị Macro có sẵn cho tôi ...

$ (SolutionDir) = D: \ GlobalDir \ Phiên bản \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Phiên bản \ AppName \ Solution1 \ Phiên bản \ ProjectA \

Tôi muốn sao chép nội dung Dir đầu ra vào thư mục sau:

D: \ GlobalDir \ Phiên bản \ AppName \ Solution2 \ Project \ Phụ thuộc

Vị trí cơ sở "D: \ GlobalDir \ Version \ AppName" cần được tìm nạp từ một trong các macro ở trên. Tuy nhiên, không có giá trị macro nào chỉ liệt kê vị trí cha.

Làm cách nào để tôi chỉ trích xuất vị trí cơ sở cho lệnh sao chép bài đăng?

Câu trả lời:


188

Nếu không có TargetDir hoặc các macro khác trỏ đến đúng vị trí, hãy sử dụng thư mục ".." để đi ngược lên phân cấp thư mục.

I E. Sử dụng $(SolutionDir)\..\..để có được thư mục cơ sở của bạn.


Để biết danh sách tất cả các macro, xem tại đây:

http://msdn.microsoft.com/en-us/l Library / c02as0cs.aspx


Cảm ơn!! Mẹo hay
Merlyn007

293

Đây là những gì bạn muốn đưa vào dòng lệnh sự kiện Post-build của dự án:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDIT: Hoặc nếu tên mục tiêu của bạn khác với Tên dự án.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
Mẹo tốt. Tôi quên các trích dẫn.
Matt Montag

3
Nó không làm việc cho tôi vì tôi đã quên /Y. Cảm ơn đã hiển thị toàn bộ lệnh.
Đánh dấu

10
Người ta có thể sử dụng xcopyvới các ký tự đại diện và các công tắc thích hợp để đạt được kết quả tương tự, trong khi duy trì cấu trúc (cây) của thư mục nguồn, chẳng hạn như:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
Tôi sẽ đề nghị sử dụng $ (TargetName) thay vì $ (ProjectName) trong phần nguồn.
Alexander Schmidt

2
cập nhật cho tôi nhận xét : copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\", không có dấu gạch chéo ngược, vì $ (SolutionDir) bao gồm dấu gạch chéo ngược (ít nhất là trong VS2012)
băng giá

40

Bạn có thể thử:

$(SolutionDir)..\..\

8
Xin lưu ý rằng biến $ (SolutionDir) đã có dấu gạch chéo ngược. Nguồn: "Thư mục của giải pháp (được xác định bằng ổ đĩa và đường dẫn); bao gồm dấu gạch chéo ngược '\'." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
snicker

10

Tôi nghĩ điều này có liên quan, nhưng tôi gặp vấn đề khi xây dựng trực tiếp bằng cách sử dụng msbuilddòng lệnh (từ tệp bó) so với xây dựng từ bên trong VS.

Sử dụng một cái gì đó như sau:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(lưu ý: start XCOPYthay vì XCOPYsử dụng để khắc phục sự cố về quyền ngăn chặn sao chép)

Macro được $(SolutionDir)đánh giá ..\khi thực thi msbuild từ một tệp dữ liệu, dẫn đến XCOPYlệnh bị lỗi. Nó hoạt động tốt khi được xây dựng từ bên trong Visual Studio. Xác nhận sử dụng /verbosity:diagnosticđể xem đầu ra được đánh giá.

$(ProjectDir)..\Thay vào đó, sử dụng macro , tương đương với điều đó, đã hoạt động tốt và giữ lại đường dẫn đầy đủ trong cả hai kịch bản xây dựng.


1
liên kết chéo với cùng một vụ hack trong trường hợp tôi quên cung cấp tín dụng ...
drzaus

Startlàm việc cho tôi (cho xcopytại một thư mục chia sẻ).
AgentFire

4

Nó sẽ không có ý nghĩa để sử dụng msbuild trực tiếp? Nếu bạn đang làm điều này với mỗi bản dựng, thì bạn có thể thêm một tác vụ msbuild ở cuối không? Nếu bạn muốn xem liệu bạn có thể tìm thấy một giá trị macro khác không được hiển thị trên Visual Studio IDE hay không, bạn có thể bật tùy chọn msbuild để chẩn đoán và điều đó sẽ hiển thị cho bạn tất cả các biến bạn có thể sử dụng, như cũng như giá trị hiện tại của họ.

Để bật tính năng này trong phòng thu trực quan, hãy chuyển đến Công cụ / Tùy chọn, sau đó cuộn xuống chế độ xem dạng cây đến phần có tên là Dự án và Giải pháp, mở rộng phần đó và nhấp vào Xây dựng và Chạy, bên phải là phần thả xuống chỉ định mức độ chi tiết của bản dựng , đặt điều đó thành chẩn đoán, sẽ cho bạn thấy những giá trị vĩ mô nào khác mà bạn có thể sử dụng.

Bởi vì tôi không biết bạn muốn đi đến cấp độ nào và mức độ phức tạp mà bạn muốn bản dựng của mình đạt được, điều này có thể cho bạn một số ý tưởng. Gần đây tôi đã thực hiện các tập lệnh xây dựng, thậm chí thực thi mã SQL như là một phần của bản dựng. Nếu bạn muốn có thêm trợ giúp hoặc thậm chí một số tập lệnh xây dựng mẫu, hãy cho tôi biết, nhưng nếu đó chỉ là một quá trình nhỏ mà bạn muốn chạy ở cuối bản dựng, thì có lẽ kịch bản msbuild đầy đủ sẽ hơi bị giết .

Hy vọng nó sẽ giúp Rihan


thx Rihan, nhưng dường như VS 2003 dường như không hỗ trợ điều này! Tôi tất nhiên khá hài lòng với sự kiện bài build ;-)
Preets

Tôi đã không nhận ra đó là vs2003, và do đó việc sử dụng msbuild như một giải pháp khả thi, nếu tôi nhớ lại vs2003 là trước thời đại msbuild? Cảm ơn vì sự trả lời. Điều may mắn nhất với VS 2003, tôi đã không nhìn lại sau khi chuyển sang VS2005
Rihan Meij
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.