Visual Studio Post Build Event - คัดลอกไปยังตำแหน่งไดเรกทอรีสัมพัทธ์


228

ในการสร้างที่ประสบความสำเร็จฉันต้องการคัดลอกเนื้อหาของไดเรกทอรีผลลัพธ์ไปยังตำแหน่งอื่นภายใต้โฟลเดอร์"ฐาน"เดียวกัน โฟลเดอร์หลักนี้เป็นส่วนสัมพัทธ์และสามารถแตกต่างกันไปตามการตั้งค่าการควบคุมแหล่ง

ฉันแสดงรายการค่ามาโครสองสามรายการที่มีให้ฉัน ...

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

ฉันต้องการคัดลอกเนื้อหา Output Dir ไปยังโฟลเดอร์ต่อไปนี้:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

ที่ตั้งฐาน "D: \ GlobalDir \ Version \ AppName" ต้องดึงข้อมูลจากมาโครด้านบน อย่างไรก็ตามไม่มีค่ามาโครแสดงรายการเฉพาะที่ตั้งหลัก

ฉันจะแยกเฉพาะตำแหน่งพื้นฐานสำหรับคำสั่ง post build copy ได้อย่างไร

คำตอบ:


188

หากไม่มี TargetDir หรือมาโครอื่นชี้ไปที่ตำแหน่งที่ถูกต้องให้ใช้ไดเรกทอรี ".. " เพื่อย้อนกลับไปตามลำดับชั้นของโฟลเดอร์

กล่าวคือ ใช้$(SolutionDir)\..\..เพื่อรับไดเรกทอรีฐานของคุณ


สำหรับรายการแมโครทั้งหมดดูที่นี่:

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


ขอบคุณ !! เคล็ดลับที่ดี
Merlyn007

293

นี่คือสิ่งที่คุณต้องการใส่ในบรรทัดคำสั่งเหตุการณ์การสร้างโพสต์ของโครงการ:

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

แก้ไข: หรือถ้าชื่อเป้าหมายของคุณแตกต่างจากชื่อโครงการ

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

1
เคล็ดลับดี ฉันลืมคำพูด
Matt Montag

3
/Yมันก็ไม่ได้ทำงานสำหรับฉันเพราะฉันลืม ขอขอบคุณที่แสดงคำสั่งทั้งหมด
ทำเครื่องหมาย

10
สามารถใช้xcopyกับ wildcards และสวิตช์ที่เหมาะสมเพื่อให้ได้ผลลัพธ์ที่คล้ายกันในขณะที่ยังคงโครงสร้าง (ต้นไม้) ของโฟลเดอร์ต้นทางเช่น:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
ฉันอยากจะแนะนำให้ใช้ $ (TargetName) แทน $ (ProjectName) ในส่วนที่มา
Alexander Schmidt

2
อัปเดตเป็น prev ของฉัน แสดงความคิดเห็น: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"โดยไม่ต้องทับขวาพิเศษตั้งแต่ $ (SolutionDir) รวมถึงเครื่องหมายต่อท้าย (อย่างน้อยใน VS2012)
น้ำแข็ง

40

คุณสามารถลอง:

$(SolutionDir)..\..\

8
โปรดทราบว่าตัวแปร $ (SolutionDir) มีเครื่องหมายทับด้านหลังแล้ว แหล่งที่มา: "ไดเรกทอรีของโซลูชัน (กำหนดด้วยไดรฟ์และเส้นทาง) รวมถึงเครื่องหมายแบ็กสแลชต่อท้าย '\' msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker

10

ฉันคิดว่าสิ่งนี้เกี่ยวข้อง แต่ฉันมีปัญหาเมื่อสร้างโดยตรงโดยใช้msbuildบรรทัดคำสั่ง (จากไฟล์แบทช์) เทียบกับสิ่งปลูกสร้างจากภายใน VS

ใช้บางสิ่งบางอย่างดังต่อไปนี้:

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

(หมายเหตุ: start XCOPYแทนที่จะXCOPYใช้เพื่อแก้ไขปัญหาสิทธิ์ที่ป้องกันการคัดลอก)

มาโคร $(SolutionDir)ประเมินผล..\เมื่อเรียกใช้งาน msbuild จาก batchfile ซึ่งส่งผลให้XCOPYคำสั่งล้มเหลว มันทำงานได้ดีเมื่อสร้างจากภายใน Visual Studio ยืนยันโดยใช้/verbosity:diagnosticเพื่อดูผลลัพธ์ที่ประเมิน

การใช้มาโคร$(ProjectDir)..\แทนซึ่งมีจำนวนเท่ากันทำงานได้ดีและรักษาพา ธ แบบเต็มในสถานการณ์บิลด์ทั้ง


1
ข้ามเชื่อมโยงไปยังสับเดียวกันในกรณีที่ฉันลืมที่จะให้เครดิต ...
drzaus

Startทำงานได้สำหรับฉัน (สำหรับxcopyที่โฟลเดอร์ที่แชร์)
AgentFire

4

มันจะไม่สมเหตุสมผลที่จะใช้ msbuild โดยตรง หากคุณกำลังทำสิ่งนี้กับทุกบิลด์คุณสามารถเพิ่มภารกิจ msbuild ได้ในตอนท้าย? ถ้าคุณเพียงต้องการดูว่าคุณไม่สามารถหาค่าแมโครอื่นที่ไม่ได้แสดงใน Visual Studio IDE คุณสามารถเปิดตัวเลือก msbuild เพื่อวินิจฉัยและจะแสดงตัวแปรทั้งหมดที่คุณสามารถใช้ได้เช่น เช่นเดียวกับมูลค่าปัจจุบันของพวกเขา

หากต้องการเปิดใช้งานนี้ใน Visual Studio ให้ไปที่เครื่องมือ / ตัวเลือกจากนั้นเลื่อนมุมมองแบบต้นไม้ลงไปในส่วนที่เรียกว่าโครงการและโซลูชันขยายและคลิกที่สร้างและเรียกใช้ที่ด้านขวาของพวกเขาคือแบบเลื่อนลงที่ระบุ verbosity การตั้งค่าดังกล่าวเป็นการวินิจฉัยจะแสดงให้คุณเห็นว่าคุณสามารถใช้ค่าแมโครอื่นใดได้บ้าง

เนื่องจากฉันไม่รู้ว่าคุณต้องการไปในระดับใดและความซับซ้อนที่คุณต้องการให้งานสร้างของคุณเป็นแบบนี้อาจทำให้คุณมีความคิด ฉันเพิ่งได้สร้างสคริปต์ที่แม้แต่เรียกใช้รหัส SQL เป็นส่วนหนึ่งของการสร้าง หากคุณต้องการความช่วยเหลือเพิ่มเติมหรือตัวอย่างสคริปต์สร้างตัวอย่างแจ้งให้เราทราบ แต่ถ้ามันเป็นเพียงกระบวนการเล็ก ๆ ที่คุณต้องการเรียกใช้เมื่อสิ้นสุดการสร้างอาจเป็นไปได้ว่าสคริปต์แบบเต็มของ msbuild นั้นน่ากลัวเกินไป .

หวังว่ามันจะช่วยริฮาน


ขอบคุณ Rihan แต่ดูเหมือนว่า VS 2003 จะไม่สนับสนุนสิ่งนี้! แน่นอนว่าฉันค่อนข้างพอใจกับการโพสต์งาน
อีเว้นท์

ฉันไม่ได้ตระหนักว่ามันเป็น vs2003 และด้วยเหตุนี้การใช้ msbuild เป็นวิธีแก้ปัญหาที่เป็นไปได้ถ้าฉันจำได้ว่า vs2003 ก่อนยุค msbuild หรือไม่ ขอบคุณสำหรับคำตอบ ขอให้โชคดีกับ VS 2003 ฉันไม่ได้หันหลังกลับไปดู VS2005 อีกต่อไปแล้ว
Rihan Meij
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.