วิธีรับฟังก์ชั่น 'เผยแพร่' ของ Visual Studio เพื่อรวมไฟล์จากเหตุการณ์หลังการสร้าง?


90

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

ฉันพัฒนาในสภาพแวดล้อม 32 บิต แต่ต้องสร้างแพ็กเกจรีลีสสำหรับสภาพแวดล้อม 64 บิตดังนั้นในการกำหนดค่า 'รีลีส' ฉันมีเหตุการณ์สร้างโพสต์ที่คัดลอก dll ของบุคคลที่สามเวอร์ชัน 64 บิตไปยังไดเร็กทอรี bin ที่เขียนทับเวอร์ชัน 32 บิต . เมื่อฉันใช้ฟังก์ชัน 'เผยแพร่' แม้ว่า dll 64 บิตที่ถูกต้องจะถูกคัดลอกไปยังไดเร็กทอรี bin แต่ก็ไม่รวมอยู่ในแพ็คเกจ

มีวิธีรับ 'เผยแพร่' เพื่อรวมไฟล์ที่คัดลอกไปยังไดเร็กทอรี bin ระหว่างเหตุการณ์สร้างโพสต์หรือไม่?


1
ถ้าคุณใช้เหตุการณ์ก่อนสร้างแทนดูเหมือนว่าจะทำงานตามที่คุณต้องการแล้ว (เทมเพลตโครงการ Visual Studio 2013, ASP.NET)
bzlm

ดูเหมือนว่าพวกเขาได้ลบพฤติกรรมที่สร้างไว้ล่วงหน้าที่กล่าวถึงในความคิดเห็นด้านบนใน Visual Studio 2015 และใหม่กว่า
justdan23

คำตอบ:


92

ฉันตอบคำถามที่เหมือนกัน แต่ต่างกันที่คุณรวมไฟล์เพิ่มเติมโดยใช้แพ็คเกจการปรับใช้เว็บ VS2010 ได้อย่างไร .

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


จาก: คุณรวมไฟล์เพิ่มเติมโดยใช้แพ็คเกจการปรับใช้เว็บ VS2010 ได้อย่างไร?


คำถามที่ดี ฉันเพียงแค่โพสต์รายการบล็อกรายละเอียดมากเกี่ยวกับเรื่องนี้ในเว็บเครื่องมือการจัดวาง (MSDeploy): สร้างแพคเกจรวมถึงไฟล์พิเศษหรือไม่รวมไฟล์ที่เฉพาะเจาะจง

นี่คือเรื่องย่อ หลังจากรวมไฟล์แล้วฉันจะแสดงวิธีการยกเว้นไฟล์ด้วย

รวมถึงไฟล์พิเศษ

การรวมไฟล์พิเศษลงในแพ็คเกจนั้นยากกว่าเล็กน้อย แต่ก็ยังไม่มีปัญหาหากคุณพอใจกับ MSBuild และถ้าคุณไม่ได้อ่านสิ่งนี้ ในการดำเนินการนี้เราจำเป็นต้องเชื่อมโยงเข้าไปในส่วนของกระบวนการที่รวบรวมไฟล์สำหรับบรรจุภัณฑ์ เป้าหมายที่เราต้องการขยายเรียกว่า CopyAllFilesToSingleFolder เป้าหมายนี้มีคุณสมบัติการพึ่งพา PipelinePreDeployCopyAllFilesToOneFolderDependsOn ซึ่งเราสามารถแตะและฉีดเป้าหมายของเราเองได้ ดังนั้นเราจะสร้างเป้าหมายชื่อ CustomCollectFiles และฉีดเข้าไปในกระบวนการ เราบรรลุสิ่งนี้ด้วยสิ่งต่อไปนี้ (จำไว้หลังคำสั่งนำเข้า)

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

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

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

สิ่งที่ฉันทำคือสร้างรายการ _CustomFiles และในแอตทริบิวต์รวมบอกให้รับไฟล์ทั้งหมดในโฟลเดอร์นั้นและโฟลเดอร์ใด ๆ ที่อยู่ข้างใต้ จากนั้นฉันใช้รายการนี้เพื่อเติมข้อมูลรายการ FilesForPackagingFromProject นี่คือรายการที่ MSDeploy ใช้เพื่อเพิ่มไฟล์พิเศษ โปรดสังเกตด้วยว่าฉันประกาศค่า Metadata DestinationRelativePath สิ่งนี้จะกำหนดเส้นทางสัมพัทธ์ที่จะวางไว้ในแพ็คเกจ ฉันใช้คำสั่ง Extra Files% (RecursiveDir)% (Filename)% (Extension) ที่นี่ สิ่งที่พูดคือการวางไว้ในตำแหน่งสัมพัทธ์เดียวกันในแพ็กเกจเนื่องจากอยู่ในโฟลเดอร์ Extra Files

การยกเว้นไฟล์

หากคุณเปิดไฟล์โครงการของเว็บแอปพลิเคชันที่สร้างด้วย VS 2010 ที่ด้านล่างคุณจะพบบรรทัดที่มี

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW คุณสามารถเปิดไฟล์โครงการภายใน VS. คลิกขวาที่โครงการเลือก Unload Project จากนั้นคลิกขวาที่โครงการที่ไม่ได้โหลดแล้วเลือกแก้ไขโครงการ

คำสั่งนี้จะรวมเป้าหมายและงานทั้งหมดที่เราต้องการ การปรับแต่งส่วนใหญ่ของเราควรเป็นหลังจากการนำเข้านั้นหากคุณไม่แน่ใจว่าจะใส่หลังจากนั้น! ดังนั้นหากคุณมีไฟล์ที่จะแยกออกจะมีชื่อรายการ ExcludeFromPackageFiles ที่สามารถใช้ทำเช่นนั้นได้ ตัวอย่างเช่นสมมติว่าคุณมีไฟล์ชื่อ Sample.Debug.js ซึ่งรวมอยู่ในเว็บแอปพลิเคชันของคุณ แต่คุณต้องการให้ไฟล์นั้นถูกแยกออกจากแพ็คเกจที่สร้างขึ้น คุณสามารถวางข้อมูลโค้ดด้านล่างหลังจากคำสั่งนำเข้านั้น

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

เมื่อประกาศการเติมข้อมูลรายการนี้ไฟล์จะถูกแยกออกโดยอัตโนมัติ สังเกตการใช้ข้อมูลเมตา FromTarget ที่นี่ ฉันจะไม่เข้าไปที่นี่ แต่คุณควรรู้ว่าต้องระบุไว้เสมอ


8
@ บอกว่าสิ่งนี้ไม่ได้ผลกับ VS2012 คุณรู้หรือไม่ว่าสิ่งนี้สามารถอัปเดตสำหรับสถานการณ์นี้ได้อย่างไร การเปลี่ยนเป็น v11.0 ไม่ทำงาน TIA.
Simon Francesco

2
ไม่มีเอกสารใด ๆ เกี่ยวกับสิ่งนี้อย่างแท้จริง เอกสารของ Microsoft อ้างอิงถึงบล็อกของคุณ
Matthew James Davis

2
@Daniel หากคุณต้องการไฟล์เฉพาะและไม่ใช่โฟลเดอร์เพียงแค่เปลี่ยน _CustomFiles เพื่อรวมไฟล์เฉพาะเหล่านั้นแทนที่จะเพิ่มแบบวนซ้ำด้วย *** ดังนั้นบางอย่างเช่น <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> อะไรทำนองนั้น
bwerks

3
@SimonFrancesco ฉันเคยประสบกับสิ่งนี้เช่นกันและการเปลี่ยนแปลงที่จำเป็นดูเหมือนจะเป็นการขยาย <CopyAllFilesToSingleFolderForMsdeployDependsOn> แทนที่จะเป็น <CopyAllFilesToSingleFolderForPackageDependsOn> ตามที่เขียนไว้ในคำตอบด้านบน
bwerks


13

ฉันพบวิธีแก้ปัญหาโดยใช้ExcludeFilesFromDeploymentองค์ประกอบภายในไฟล์โครงการ ฉันได้แนวคิดจากWeb Deployment: การยกเว้นไฟล์และโฟลเดอร์

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

  1. แก้ไขการตั้งค่าโครงการ "แพ็คเกจ / เผยแพร่เว็บ" และ
    เลือกรายการที่จะปรับใช้เป็น "ไฟล์ทั้งหมดในโฟลเดอร์โครงการนี้"
  2. ยกเลิกการโหลดโครงการ
  3. คลิกขวาที่โปรเจ็กต์ที่ไม่ได้โหลดและเลือกเพื่อแก้ไขคอนฟิกโปรเจ็กต์
  4. ค้นหาPropertyGroupองค์ประกอบที่เกี่ยวข้องกับการตั้งค่าการกำหนดค่าเช่น "Release"
  5. ภายในPropertyGroupองค์ประกอบให้เพิ่มองค์ประกอบต่อไปนี้และยกเว้นไฟล์และโฟลเดอร์ที่คุณไม่ต้องการในแพ็คเกจ

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. บันทึกและโหลดโครงการของคุณใหม่

สิ่งนี้ช่วยแก้ปัญหาของฉันได้ในขณะนี้ แต่หากมีวิธีแก้ไขที่ดีกว่าโปรดแจ้งให้เราทราบเนื่องจากไม่เหมาะเนื่องจากมีการแฮ็กเกอร์เกี่ยวข้อง แต่อีกครั้งบางทีนี่อาจเป็นสถานการณ์การปรับใช้ที่ผิดปกติ?


6

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


1
ถูกต้อง แต่นอกจากนี้คุณต้องเลือก "คัดลอกหากใหม่กว่า" หรือ "คัดลอกเสมอ" เพราะมิฉะนั้นการดำเนินการเริ่มต้นคือ "ห้ามคัดลอก" แม้ว่าจะเลือก "เนื้อหา" ก็ตาม
แมท

1
เห็นด้วยกับ Matt สำหรับขั้นตอนเพิ่มเติม
Gomes

7
ไม่มีการดำเนินการสร้างสำหรับโฟลเดอร์ (VS2013)
Cristian E.

copytooutputdirectory = คัดลอกเสมอ
Gomes

ทำงานได้โดยไม่ต้องคัดลอกเสมอ
Tengiz

3

ฉันรู้ว่ามันเป็นคำถามเก่า แต่ไม่ได้ผลสำหรับฉัน

ในปี 2017 VS ฉันคลิกขวาที่โฟลเดอร์พิเศษที่จะเผยแพร่และเลือกเผยแพร่มันใช้งานได้

ตัวอย่าง:

ป้อนคำอธิบายภาพที่นี่


แม้ว่าจะเป็นขั้นตอนพิเศษเล็กน้อย แต่ก็ง่ายมาก
Ciaran Gallagher

0

การเพิ่มโฟลเดอร์ bin (และเป็นเนื้อหา) ในโปรเจ็กต์ทำให้ไฟล์ถูกคัดลอกไปยังไดเร็กทอรีเอาต์พุตที่เผยแพร่

สำหรับฉันปัญหาของฉันคือฉันต้องวางไฟล์ลิขสิทธิ์ซอฟต์แวร์ที่เป็นกรรมสิทธิ์ไว้ใน bin / โฟลเดอร์ แต่ไม่ต้องการคัดลอกการปรับใช้แต่ละครั้งด้วยตนเอง

นี่คือการใช้ Visual Studio 2015 Professional


0

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

บทความเกือบทั้งหมดเกี่ยวกับการรวมไฟล์พิเศษในสิ่งพิมพ์ของคุณใช้วิธีนี้ในการเพิ่มCopyAllFilesToSingleFolderForPackageDependsOnหรือCopyAllFilesToSingleFolderForMSDeployDependsOnรายการในไฟล์PropertyGroupเหล่านี้และเหมือนกันทั้งหมดเช่น "ฉันเพิ่มสิ่งนี้ไว้ที่ส่วนท้ายของไฟล์ ... "

นี่คือสิ่งที่ฉันทำและใช้เวลาช่วงบ่ายพยายามค้นหาว่าทำไมไม่มีอะไรเกิดขึ้นจนกระทั่งฉันรู้ว่ามีPropertyGroupส่วนที่ด้านบนของไฟล์อยู่แล้ว เมื่อฉันใส่CopyAllFilesToSingleFolderForPackageDependsOnเข้าไปในส่วนนั้นมันก็ใช้ได้ดี

หวังว่าจะช่วยประหยัดเวลาของใครบางคนได้ในวันหนึ่ง

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