Visual Studio: คำสั่งหลังการสร้างหลายคำสั่ง?


101

Visual Studio 2008 ให้ฉันประกาศคำสั่งและแนบไปกับเหตุการณ์หลังการสร้างสำหรับโครงการ เช่นเดียวกับนักพัฒนาหลายคนฉันใช้มันเป็นประจำเพื่อ xcopy ไฟล์ไปยังไดเร็กทอรีเอาต์พุตของแอปพลิเคชัน

ฉันกำลังทำงานในโปรเจ็กต์ที่ฉันต้องการ xcopy ไฟล์จากที่ต่างๆสองแห่งไปยังปลายทางที่ต่างกันสองแห่งทั้งหมดนี้อยู่ในโปรเจ็กต์เดียว กล่าวอีกนัยหนึ่งฉันต้องเรียกใช้คำสั่ง xcopy สองคำสั่งที่แตกต่างกันจากเหตุการณ์หลังการสร้างเดียวกัน ดูเหมือนว่าเหตุการณ์หลังสร้างจะใช้คำสั่งเดียวเท่านั้นและถ้าฉันต้องการเรียกใช้คำสั่งหลายคำสั่งฉันจะต้องใส่คำสั่งในไฟล์ * .bat และเรียกสิ่งนั้นจากเหตุการณ์หลังการสร้าง

ถูกต้องหรือมีวิธีที่ง่ายกว่าในการเรียกใช้คำสั่งสองคำสั่งจากเหตุการณ์หลังการสร้าง ขอบคุณล่วงหน้าสำหรับความช่วยเหลือของ.

คำตอบ:


124

คุณสามารถพิมพ์คำสั่ง post build ได้มากเท่าที่คุณต้องการ เพียงแค่แยกพวกเขาตามบรรทัดใหม่

นี่คือตัวอย่างจากโครงการหนึ่งของฉัน

โพสต์บรรทัดคำสั่งเหตุการณ์สร้าง


3
การรวมภาพหน้าจอจะมีประโยชน์ก็ต่อเมื่อคุณตั้งใจจะโฮสต์ไว้ตลอดไป
Amandalishus

1
@ OWenJ23 ... หรือ 'imageshack' ในกรณีนี้;)
Anthony Walsh

28
แม้จะอยู่คนละบรรทัด แต่คำสั่งของฉันก็ทำงานร่วมกันราวกับว่าอยู่ในบรรทัดเดียว
Trevor

6
น่าเสียดายที่ดูเหมือนว่าอย่างน้อย VS2015 จะไม่รายงานข้อผิดพลาดหากหนึ่งในคำสั่งกลางล้มเหลว ... มันจะรายงานผลลัพธ์ของคำสั่งสุดท้ายอันเป็นผลมาจากขั้นตอนหลังการสร้าง
Johannes S.

3
ดูเหมือนว่าจะใช้งานได้จากภายใน Visual Studio - แต่ไม่รองรับถ้าคุณใช้ MsBuild บนเครื่องสร้าง TFS MsBuild ขีดเส้นแบ่งบรรทัดและทำให้คำสั่งล้มเหลวเนื่องจากไวยากรณ์ไม่ถูกต้อง
Jeff B

107

สำคัญ: เมื่อเรียกใช้แบตช์ไฟล์คุณต้องใช้คำสั่ง "โทร" ตามลำดับบรรทัดต่อไปนี้จึงจะดำเนินการได้ หากคุณไม่ใช้ "โทร" การดำเนินการจะเข้าสู่. bat และจะไม่กลับไปที่บรรทัดต่อไปนี้ เช่นเดียวกับใน DOS prompt

เช่น:

call MyBatch1.bat
call MyBatch2.bat

3
เคล็ดลับนี้ใช้กับคำสั่ง grunt และ npm เนื่องจากทั้งคู่ทำงานผ่านไฟล์แบตช์ (grunt.cmd และ npm.cmd)
Matt Varblow

16

มีอีกทางเลือกหนึ่งคือคุณสามารถแยกคำสั่งด้วย&&ไฟล์. เช่น

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

สิ่งนี้ไม่เหมือนกับการแยกด้วยการขึ้นบรรทัดใหม่: &&หากคำสั่งก่อนหน้าล้มเหลวคอมมินต์ถัดไปจะไม่ทำงาน

การคั่นด้วยขึ้นบรรทัดใหม่จะอ่านง่ายกว่าดังนั้นคุณควรเลือกมากกว่า อย่างไรก็ตามฉันรู้อย่างน้อยหนึ่งกรณีเมื่อ&&มีประโยชน์ เป็นสถานการณ์สมมติเมื่อคุณใช้แผ่นคุณสมบัติเพื่อให้มีขั้นตอนหลังการสร้างที่แตกต่างกันบนเครื่องต่างๆ VS 2008 ไม่อนุญาตให้ตั้งค่า PostBuildStep ในแผ่นคุณสมบัติโดยตรง แต่คุณสามารถเพิ่มมาโครผู้ใช้ด้วยคำสั่งของคุณและเรียกใช้จากการตั้งค่าโครงการหลัก มาโครเป็นบรรทัดเดียวดังนั้นคุณสามารถใช้&&คำสั่งหลายคำสั่งได้


11

แต่ละคำสั่งควรอยู่ในบรรทัดแยกกัน สิ่งที่ฉันพบก็คือหากมีข้อผิดพลาดในการเรียกใช้หนึ่งในคำสั่งเหล่านั้นโพสต์บิลด์ทั้งหมดจะล้มเหลวดังนั้นคุณจะต้องลองใช้คำสั่งหลังการสร้างทีละคำสั่งเพื่อดีบัก


2
"xcopy / f" จะแสดงชื่อไฟล์ต้นทางและเป้าหมายแบบเต็มซึ่งจะพิมพ์ก่อนเกิดความล้มเหลวทำให้คำสั่ง xcopy หลายคำวินิจฉัยง่ายกว่าคำสั่งคัดลอกหลายคำสั่ง
โยโย่

9

การแยกคำสั่งด้วย & หรือ && หรือ; ไม่ทำงานใน VS2017 ไม่สามารถเชื่อฟังก์ชั่นง่ายๆเช่นนี้ไม่มีใน VS2017 Visual studio พยายามดำเนินการข้อความทั้งหมดในหน้าต่างเหตุการณ์การสร้างโพสต์เป็นสตริงเดียว ตัวเลือกเดียวสำหรับฉันในตอนนี้คือการสร้างชุดสคริปต์ที่ฉันไม่ชอบเป็นพิเศษ


1
การแยกคำสั่งด้วย && ใช้ได้ผลกับฉันใน VS2017 การระบุแต่ละคำสั่งในบรรทัดแยกกันในตัวแก้ไข VS2017 ไม่ได้ผลสำหรับฉัน
codeniffer

5

การเพิ่มคำตอบของwomp :

หากคุณมีแผ่นคุณสมบัติหลายแผ่นพร้อมกับสิ่งที่ต้องทำในเหตุการณ์บิลด์เดียวกันคุณสามารถทำสิ่งต่อไปนี้เพื่อเชื่อมโยงคำสั่ง:

%(Command)
echo foo

โดยที่%(Command)ขยายเป็นค่าก่อนหน้าของคำสั่ง

ส่วนตัวผมทำเช่นนี้สำหรับทุกการสร้างเหตุการณ์แม้ว่าฉันยังไม่ได้มีคำสั่งที่ได้รับมรดกเพราะความมั่นใจว่านี้จะมีปัญหาใด ๆ ถ้าฉันจะเพิ่มแผ่นคุณสมบัติในภายหลัง


1
นอกจากนี้ยังใช้ได้กับ Custom Build Step นอกจากนี้การเรียกใช้exitคำสั่งชุดงานที่ใดก็ได้ตามห่วงโซ่ทำให้โซ่ยกเลิก แท้จริงexit 1ที่ทำให้เกิดการสร้างที่จะล้มเหลวในขณะที่exit 0เพียงแค่ยกเลิกขั้นตอนและสร้างอย่างต่อเนื่อง
Martin Connell

3

ใน Visual Studio 2017 คุณสามารถทำได้:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
ฉันแก้ไข. csproj และเพิ่ม <Command> </Command> รอบ ๆ คำสั่งเหตุการณ์ postbuild สองคำสั่งของฉัน ดูเหมือนจะไม่ได้ผล เมื่อฉันดูใน Build Events ใน Visual Studio มันมี <Command> </Command> รอบสองคำสั่ง แต่ให้ข้อผิดพลาดในการสร้าง: คำสั่ง "<Command xmlns =" ​​.. "> command1 command2 </Command>" ออกด้วยรหัส 255
จิมมี่

1

แนวทางที่แนะนำโดย womp ใช้งานได้ใน Visual Studio 2015/2017 (Windows) แต่ใช้ไม่ได้ใน Visual Studio for Mac (Preview) ซึ่งดูเหมือนจะดำเนินการเฉพาะคำสั่งแรกเท่านั้น วิธีเดียวที่ฉันพบว่าใช้ได้กับ Visual Studio ทั้ง Mac และ Windows คือการเชื่อมโยงคำสั่ง MSBuild 2 คำสั่ง:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

ตัวอย่างข้างต้นใช้เหตุการณ์ "AfterResolveReferences" แต่เห็นได้ชัดว่าควรใช้กับเหตุการณ์ PostBuild ด้วย


1

ไม่มีวิธีแก้ปัญหาที่ดีสำหรับปัญหานี้ แนวคิดการโทรทำให้สคริปต์อื่น ๆ ทำงาน ฉันสังเกตเห็นว่าการตรวจจับข้อผิดพลาดจะไม่ทำงาน ใส่ 'exit / b 1' ใน FailMe.cmd ใช้ 'เรียก FailMe.cmd' ในขั้นตอนการสร้างโพสต์ สังเกตว่าการสร้างไม่ล้มเหลว? ฉันใช้ VS 2017 สร้างโครงการ C # ตอนนี้ลองใช้ 'FailMe.cmd' ตอนนี้บิลด์รายงานข้อผิดพลาด

ดังนั้นคุณอาจจะดีกว่าแค่ใช้สคริปต์เดียวหากการรายงานข้อผิดพลาดมีความสำคัญ


-4

เพียงเติมคำนำหน้า "โทร" ไปยังชุดสคริปต์ของคุณ ดังนั้นคำสั่งที่อยู่ด้านล่างสคริปต์แบตช์จะถูกดำเนินการหลังจากส่งคืนการโทรจากสคริปต์แบตช์

call Script1.cmd
call Script2.bat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.