ออกจากการสร้างโพสต์ด้วยรหัส 1


108

ฉันมีโครงการที่มีเหตุการณ์สร้างโพสต์:

copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe  $(TargetDir)

ทำงานได้ดีทุกครั้งบนเครื่องของฉัน ฉันมีนักพัฒนารายใหม่ที่มักจะได้รับข้อผิดพลาด "ออกด้วยรหัส 1" ฉันให้เธอเรียกใช้คำสั่งเดียวกันในพรอมต์ DOS และทำงานได้ดี สาเหตุนี้คืออะไร? มีวิธีใดบ้างที่จะไปสู่ข้อผิดพลาดที่แท้จริง?

เราทั้งคู่ใช้ Visual Studio 2008


ในกรณีของฉันคำตอบที่ทิมสก็อตต์ให้ไว้ในตอนท้ายของหน้านี้ (ดังนั้นฉันจึงมองข้ามไปในตอนต้น) เพื่อแก้ปัญหาของฉัน
yu yang Jian

คำตอบ:


115

เธอมีช่องว่างในชื่อโฟลเดอร์ในเส้นทางของเธอและไม่มีเครื่องหมายคำพูดรอบ ๆ


12
การใส่คำพูดบนชื่อเส้นทางถือเป็นแนวทางปฏิบัติที่ดี ไม่ทำงานในเส้นทางที่มีช่องว่างจะดีกว่า :-)
Asher

4
copy / y "$ (TargetDir) Dotfuscated \" "$ (TargetDir)" คำสั่งนี้ใช้ไม่ได้สำหรับฉันและถ้าฉันเขียน exit 0 ในตอนท้ายก็ใช้ได้ดี คุณบอกฉันได้ไหมว่าทำไม
Rikin Patel

59

คนที่มี "Pings" ช่วยฉันด้วย ... แต่อาจจะอธิบายได้ดีกว่าเล็กน้อย ...

สำหรับฉันวิธีแก้ปัญหาคือการเปลี่ยนแปลง:

copy $(TargetDir)$(TargetName).* $(SolutionDir)bin

สำหรับสิ่งนี้:

copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"

หวังว่ามันจะเหมาะกับคุณ :-)


48

ฉันได้เพิ่มสิ่งนี้สำหรับผู้เยี่ยมชมในอนาคตเนื่องจากนี่เป็นคำถามที่ใช้งานได้ดี

ROBOCOPY ออกด้วย "รหัสความสำเร็จ" ซึ่งอยู่ภายใต้ 8 ดู: http://support.microsoft.com/kb/954404

ซึ่งหมายความว่า:

robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.

ดังนั้นฉันจึงแก้ไขสิ่งนี้ได้อย่างง่ายดายโดยเพิ่มสิ่งนี้ที่ด้านล่างของไฟล์แบตช์

exit 0

แนะนำให้จัดการข้อผิดพลาด ROBOCOPY ในลักษณะนี้

rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed

rem end of batch file
GOTO success

:failed
rem do not pause as it will pause msbuild.
exit 1

:success
exit 0    

ความสับสนจะถูกตั้งค่าเมื่อไม่มีการคัดลอกไฟล์ = ไม่มีข้อผิดพลาดใน VS. จากนั้นเมื่อมีการเปลี่ยนแปลงไฟล์จะถูกคัดลอกข้อผิดพลาด VS แต่ทุกอย่างที่นักพัฒนาต้องการเสร็จสิ้น

เคล็ดลับเพิ่มเติม: อย่าใช้การหยุดชั่วคราวในสคริปต์เพราะจะกลายเป็นการหยุดชั่วคราวแบบไม่มีกำหนดในบิลด์ VS timeout 10ขณะที่การพัฒนาสคริปต์ใช้สิ่งที่ต้องการ คุณจะสังเกตเห็นสิ่งนี้และแสดงความคิดเห็นแทนที่จะสร้างแบบแขวน


4
สิ่งที่ฉันกำลังมองหา ขอบคุณ !!
Ricky

ตอบคำตอบ 8 ปีเพื่อบอกว่าหากคุณต้องการซับเดียวไม่ใช่ไฟล์ค้างคาวคุณสามารถเพิ่ม "& exit 0" ที่ท้ายสตริงเหตุการณ์หลังการสร้าง
Eric Wu

46

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


ช่วยฉันได้หนึ่งชั่วโมงขอบคุณ! ดาวน์โหลดโค้ดจากอินเทอร์เน็ตและ Windows 7 ตั้งค่าโฟลเดอร์เป็นแบบอ่านอย่างเดียวโดยอัตโนมัติ
Johan Petersson

1
ฉันยังใช้ xcopy แทนและใช้แฟล็ก / y คำสั่งทั้งหมดmicrosoft.com/resources/documentation/windows/xp/all/proddocs/…
Johan Petersson


8

ฉันต้องเรียกใช้ VS ในฐานะผู้ดูแลระบบเพื่อรับสำเนาหลังการสร้างไปยังระบบปฏิบัติการที่ได้รับการป้องกัน ".. \ Common7 \ IDE \ PrivateAssemblies" จึงจะทำงานได้


5

สำหรับผู้ที่ใช้ ' สำเนาคำสั่งในการสร้างเหตุการณ์ ( Pre-สร้างเหตุการณ์บรรทัดคำสั่งและ / หรือโพสต์สร้างเหตุการณ์บรรทัดคำสั่ง ) จากโครงการ -> Properties : คุณ ' คัดลอก ' copy "source of files" "destination for files"พารามิเตอร์ของคำสั่งควรมีลักษณะเช่นที่นี่: อย่าลืมใช้เครื่องหมายคำพูด (เพื่อหลีกเลี่ยงปัญหาเกี่ยวกับช่องว่างในสตริงที่อยู่)


4

ฉันมีปัญหาที่คล้ายกัน แต่เฉพาะในสภาพแวดล้อมการสร้างของเจนกินส์ เพื่อแก้ไขปัญหาฉันเปลี่ยนจากการใช้คำสั่ง copy ในเหตุการณ์ post build เป็นการใช้ copy target

ฉันเปลี่ยนสิ่งนี้:

   <PropertyGroup>
      <PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
   </PropertyGroup>

สำหรับสิ่งนี้:

  <Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
  </Target>

และใช้งานได้ดีในขณะนี้

ข้อผิดพลาดเฉพาะที่ฉันได้รับคือ:

(PostBuildEvent target) -> 
  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>

คุณเปลี่ยนแปลงได้อย่างไร? คุณแก้ไขด้วยตนเองหรือไม่ คุณดำเนินการตามเป้าหมายอย่างไร? ดูเหมือนว่าคุณต้องระบุในบรรทัดคำสั่ง msbuild ฉันมีปัญหาเดียวกันแน่นอนในสภาพแวดล้อมเจนกินส์ของฉันซึ่งแปลกเพราะโฟลเดอร์ที่สร้าง msbuild ทั้งหมดเป็นแบบอ่านอย่างเดียวเสมอ ทำไมสำเนาบนเครื่องของฉันได้ดี แต่ไม่ได้อยู่ในเซิร์ฟเวอร์นั้นอยู่นอกเหนือฉัน
shawn1874

ฉันเพิ่งใช้ Notepad ++ เพื่อแก้ไขไฟล์ csproj เบ็ด "AfterBuild" เป็นเบ็ดมาตรฐานดังนั้นหากมีอยู่จะถูกเรียกโดยอัตโนมัติหลังจากกระบวนการสร้าง
TechSavvySam

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

ในตอนแรกไม่ชัดเจนว่าลำดับการสร้างมีไว้สำหรับการกำหนดค่าแต่ละรายการ ฉันคิดว่านั่นเป็นการตั้งค่าโซลูชันมากกว่า แต่เห็นได้ชัดว่าคุณต้องอัปเดตลำดับการสร้างในการกำหนดค่าทั้งหมด
shawn1874

3

ฉันสามารถแก้ไข Code 1 ของฉันได้โดยเรียกใช้ Visual Studio ในฐานะผู้ดูแลระบบ เห็นได้ชัดว่าไม่มีสิทธิ์เข้าถึงคำสั่งเชลล์โดยไม่มีผู้ดูแลระบบ


2

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


3
ประโยชน์ของอีกอย่างหนึ่งคืออะไร?
GregC

2

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


2

ฉันเพิ่งได้รับข้อผิดพลาดเดียวกัน ฉันมี% ในเส้นทางปลายทางที่จำเป็นต้องหลบหนี

c:\projects\%NotAnEnvironmentVariable%

จำเป็นต้องเป็น

c:\projects\%%NotAnEnvironmentVariable%%

2

ตกลงนี่เป็นปัญหาที่มีวิธีแก้ปัญหามากมายดังนั้นฉันจึงโพสต์ของฉันเพื่อให้คำแนะนำแก่ผู้คนเพิ่มเติม สถานการณ์ของฉันคือตรวจสอบโฟลเดอร์ในเส้นทางของคุณอีกครั้งและตรวจสอบให้แน่ใจว่ามีอยู่ในเครื่องของคุณทั้งหมด ตัวอย่างเช่น: "$ (SolutionDir) \ partBin \ Bin \ $ (ProjectName) .pdb" แต่ "Bin" ไม่อยู่ในโฟลเดอร์ partBin


1
BTW, \ after $(SolutionDir)ซ้ำซ้อน
Diablo

2

สำหรับผู้ที่ใช้คำสั่ง 'copy' ใน Build Events (Pre-build event command line หรือ / and Post-build event command line) จาก Project -> Properties: target folder ควรมีอยู่


0

ทางออกมากมาย ...

ในกรณีของฉันฉันต้องบันทึกไฟล์ bat ด้วยการเข้ารหัสที่ไม่ใช่ Unicode (Western, Windows) ตามค่าเริ่มต้นเมื่อฉันเพิ่มไฟล์ลงในสตูดิโอวิชวล (และฉันน่าจะทำมันนอก VS) มันจะเพิ่มด้วยการเข้ารหัส UTF-8


0

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


0

ยังได้คำตอบอีก ...

ในกรณีของฉันฉันมีโครงการ Visual Studio 2017 ที่กำหนดเป้าหมายทั้ง. Net Standard 1.3 และ. Net Framework 2.0 สิ่งนี้ถูกระบุในไฟล์. csproj ดังนี้:

<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>

ฉันยังมีบรรทัดคำสั่งหลังการสร้างเหตุการณ์เช่นนี้:

copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"

กล่าวอีกนัยหนึ่งฉันพยายามคัดลอก. Net Framework .dll ที่สร้างโดยบิลด์ไปยังตำแหน่งอื่น

สิ่งนี้ล้มเหลวด้วยข้อผิดพลาดนี้เมื่อฉันทำการสร้างใหม่:

MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.

หลังจากหงุดหงิดมากในที่สุดฉันก็พบว่าสิ่งที่เกิดขึ้นคือการสร้างใหม่ลบไฟล์เอาต์พุตทั้งหมดจากนั้นทำการสร้างสำหรับ. Net Standard 1.3 จากนั้นพยายามเรียกใช้บรรทัดคำสั่งเหตุการณ์หลังการสร้างซึ่งล้มเหลวเนื่องจากไฟล์ที่จะคัดลอก ยังไม่ได้สร้าง

ดังนั้นวิธีแก้ปัญหาคือเปลี่ยนลำดับของการสร้างเช่นสร้างสำหรับ. Net Framework 2.0 ก่อนจากนั้นสำหรับ. Net Standard 1.3

<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>

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


0

ในกรณีของฉันฉันต้องcd(เปลี่ยนไดเร็กทอรี) ก่อนที่จะเรียกไฟล์ bat เนื่องจากภายในไฟล์ bat เป็นการดำเนินการคัดลอกที่ระบุพา ธ สัมพัทธ์

:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.