ฉันจะ จำกัด กิจกรรม post-build ของฉันให้ทำงานเฉพาะสำหรับ build หนึ่งประเภทได้อย่างไร
ฉันกำลังใช้กิจกรรมเพื่อคัดลอกไฟล์ DLL ไปยังไดเรกทอรีเสมือน IIS ในเครื่อง แต่ฉันไม่ต้องการให้สิ่งนี้เกิดขึ้นบนเซิร์ฟเวอร์การสร้างในโหมดรีลีส
ฉันจะ จำกัด กิจกรรม post-build ของฉันให้ทำงานเฉพาะสำหรับ build หนึ่งประเภทได้อย่างไร
ฉันกำลังใช้กิจกรรมเพื่อคัดลอกไฟล์ DLL ไปยังไดเรกทอรีเสมือน IIS ในเครื่อง แต่ฉันไม่ต้องการให้สิ่งนี้เกิดขึ้นบนเซิร์ฟเวอร์การสร้างในโหมดรีลีส
คำตอบ:
กิจกรรมก่อนและหลังสร้างบิลด์จะทำงานเป็นสคริปต์ชุดงาน $(ConfigurationName)
คุณสามารถทำคำสั่งเงื่อนไขใน
ตัวอย่างเช่น
if $(ConfigurationName) == Debug xcopy something somewhere
FYI คุณไม่จำเป็นต้องใช้ goto คำสั่งshell IFสามารถใช้กับวงเล็บเหลี่ยมได้:
if $(ConfigurationName) == Debug (
copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
echo "why, Microsoft, why".
)
"$(ConfigurationName)"
(สังเกตเครื่องหมายคำพูด) หากคุณได้รับรหัสข้อผิดพลาด 255
$(ConfigurationName)
นั้นว่างเปล่า (บรรทัดคำสั่งเหตุการณ์หลังสร้าง) if "$(Configuration)" == "Debug"
ทำงานให้ฉัน BTW ถ้าคุณต้องการที่จะทำบางสิ่งบางอย่างในการกำหนดค่าอื่น ๆ if NOT "$(Configuration)" == "Debug"
ทั้งหมดการใช้งาน
เพิ่มกิจกรรมสร้างโพสต์ของคุณเหมือนปกติ จากนั้นบันทึกโครงการของคุณเปิดในNotepad (หรือตัวแก้ไขรายการโปรดของคุณ) และเพิ่มเงื่อนไขให้กับกลุ่มคุณสมบัติ PostBuildEvent นี่คือตัวอย่าง:
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
cd "$(ProjectDir)"
cd ""
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>
คุณยังสามารถทำเช่นนี้กับ ตัวแปรมาโครและทุกอย่างทำงานได้ตามปกติ
อีกทางเลือกหนึ่ง (เนื่องจากเหตุการณ์ถูกใส่ลงในไฟล์แบตช์แล้วเรียกว่า) ให้ใช้สิ่งต่อไปนี้ (ในกล่องสร้างเหตุการณ์ไม่ใช่ในไฟล์แบตช์):
if $(ConfigurationName) == Debug goto :debug
:release
signtool.exe ....
xcopy ...
goto :exit
:debug
' Debug items in here
:exit
วิธีนี้คุณสามารถมีกิจกรรมสำหรับการกำหนดค่าใด ๆ และยังคงจัดการกับแมโครแทนที่จะต้องผ่านพวกเขาลงในแฟ้มชุดจำได้ว่า%1
เป็น$(OutputPath)
ฯลฯ
Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
if
และใช้งานได้goto :$(ConfigurationName)
Visual Studio 2015: ไวยากรณ์ที่ถูกต้องคือ (เก็บไว้ในหนึ่งบรรทัด):
if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)
ไม่มีข้อผิดพลาด 255 ที่นี่
ตั้งแต่ Visual Studio 2019 .csproj
รูปแบบที่ทันสมัยรองรับการเพิ่มเงื่อนไขโดยตรงในTarget
องค์ประกอบ:
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
<Exec Command="nswag run nswag.json" />
</Target>
UI ไม่มีวิธีในการตั้งค่านี้ แต่ดูเหมือนว่าจะออกจากConfiguration
แอตทริบิวต์อย่างปลอดภัยหากคุณทำการเปลี่ยนแปลงผ่าน UI
คุณสามารถส่งชื่อการกำหนดค่าไปยังสคริปต์หลังการสร้างและตรวจสอบได้ที่นั่นเพื่อดูว่าควรรันหรือไม่
$(ConfigurationName)
ส่งชื่อการกำหนดค่าที่มี
ตรวจสอบว่ามันขึ้นอยู่กับวิธีที่คุณใช้ขั้นตอนหลังการสร้าง - มันจะเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
สิ่งนี้ใช้ได้กับฉันใน Visual Studio 2015
ฉันคัดลอกไฟล์ DLL ทั้งหมดจากโฟลเดอร์ที่อยู่ในโฟลเดอร์ไลบรารีในระดับเดียวกับโฟลเดอร์โซลูชันของฉันไปยังไดเรกทอรีเป้าหมายของโครงการที่กำลังสร้าง
ใช้เส้นทางสัมพัทธ์จากไดเรกทอรีโครงการของฉันและขึ้นโครงสร้างโฟลเดอร์สองขั้นตอนด้วย .. \ .. \ lib
MySolutionFolder
.... MyProject
Lib
if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")
เช่นเดียวกับการตั้งค่าโครงการใด ๆ buildevents สามารถกำหนดค่าต่อการกำหนดค่า เพียงเลือกการกำหนดค่าที่คุณต้องการเปลี่ยนแปลงในเมนูดรอปดาวน์ของหน้าคุณสมบัติและแก้ไขขั้นตอนการสร้างโพสต์
ใน Visual Studio 2012 คุณต้องใช้ (ฉันคิดว่าใน Visual Studio 2010 ด้วย)
if $(Configuration) == Debug xcopy
$(ConfigurationName)
ถูกระบุว่าเป็นแมโคร แต่ไม่ได้กำหนดไว้
เปรียบเทียบ: แมโครสำหรับคำสั่งการสร้างและคุณสมบัติ