เครื่องมือ SolutionPackager

SolutionPackager เป็นเครื่องมือที่สามารถย่อยไฟล์โซลูชันที่บีบอัดของ Microsoft Dataverse ไปเป็นไฟล์ XML หลายๆ ไฟล์ และไฟล์อื่นๆ จากนั้นคุณสามารถจัดการไฟล์เหล่านี้ได้อย่างง่ายดายโดยใช้ระบบควบคุมแหล่งที่มา ส่วนต่อไปนี้แสดงวิธีเรียกใช้เครื่องมือและวิธีใช้เครื่องมือด้วยโซลูชันที่มีการจัดการและไม่มีการจัดการ

จะหาเครื่องมือ SolutionPackager ได้ที่ไหน

เครื่องมือ SolutionPackager มีการแจกจ่ายเป็นส่วนหนึ่งของแพคเกจ NuGet Microsoft.CrmSdk.CoreTools ในการติดตั้งโปรแกรม ให้ทำตามขั้นตอนเหล่านี้

  1. ดาวน์โหลดแพคเกจ NuGet
  2. เปลี่ยนชื่อนามสกุลไฟล์แพคเกจจาก .nupkg เป็น .zip
  3. แตกเนื้อหาของไฟล์ zip ที่บีบอัด

คุณจะพบไฟล์ปฏิบัติการ SolutionPackager.exe ในโฟลเดอร์ <extracted-folder-name>/contents/bin/coretools เรียกใช้โปรแกรมจากโฟลเดอร์ coretools หรือเพิ่มโฟลเดอร์นั้นในพาธของคุณ

อาร์กิวเมนต์บรรทัดคำสั่งของ SolutionPackager

SolutionPackager เป็นเครื่องมือบรรทัดคำสั่งที่สามารถเรียกใช้ด้วยพารามิเตอร์ที่ระบุในตารางต่อไปนี้

อาร์กิวเมนต์ Description
/action: {Extract|Pack} จำเป็น การกระทำที่จะดำเนินการ การดำเนินการสามารถเป็นได้ทั้งเพื่อแยกไฟล์ .zip โซลูชันไปยังโฟลเดอร์หรือเพื่อแพคโฟลเดอร์ลงในไฟล์ .zip
/zipfile: <file path> จำเป็น พาธและชื่อของไฟล์ .zip โซลูชัน เมื่อแตก ไฟล์จะต้องมีอยู่และสามารถอ่านได้ เมื่อทำการบรรจุ ไฟล์จะถูกแทนที่
/folder: <folder path> จำเป็น พาธไปยังโฟลเดอร์ เมื่อแตกไฟล์ โฟลเดอร์นี้จะถูกสร้างและบรรจุด้วยไฟล์ส่วนประกอบ เมื่อทำการบรรจุ โฟลเดอร์นี้จะต้องมีอยู่แล้ว และมีไฟล์ส่วนประกอบที่แตกก่อนหน้านี้
/packagetype: {Unmanaged|Managed|Both} ไม่บังคับ ชนิดของแพคเกจที่จะดำเนินการ ค่าเริ่มต้นคือ ไม่มีการจัดการ อาร์กิวเมนต์นี้อาจถูกละเว้นในโอกาสส่วนใหญ่ เนื่องจากชนิดของแพคเกจสามารถอ่านได้จากภายในไฟล์ .zip หรือไฟล์ส่วนประกอบ เมื่อมีการแยกและระบุทั้งสองไฟล์ ไฟล์ .zip ที่มีการจัดการและไม่มีการจัดการจะต้องมีอยู่และถูกประมวลผลในโฟลเดอร์เดียว เมื่อมีการบรรจุและระบุทั้งสองไฟล์ ไฟล์ .zip ที่ได้รับการจัดการและไม่ได้รับการจัดการถูกสร้างขึ้นจากโฟลเดอร์เดียว สำหรับข้อมูลเพิ่มเติม โปรดดูหัวข้อการทำงานกับโซลูชันที่ได้รับการจัดการและไม่ได้รับการจัดการในภายหลังในหัวข้อ
/allowWrite:{Yes|No} ไม่บังคับ ค่าเริ่มต้นคือ ใช่ อาร์กิวเมนต์นี้ใช้ระหว่างการแยกเท่านั้น เมื่อ /allowWrite:ไม่ได้ระบุ เครื่องมือจะดำเนินการทั้งหมด แต่ป้องกันไม่ให้เขียนหรือลบไฟล์ใด ๆ การดำเนินการแยกสามารถประเมินได้อย่างปลอดภัย โดยไม่ต้องเขียนทับหรือลบไฟล์ใดๆ ที่มีอยู่
/allowDelete:{Yes|No|Prompt} ไม่บังคับ ค่าเริ่มต้นคือ พร้อมท์ อาร์กิวเมนต์นี้ใช้ระหว่างการแยกเท่านั้น เมื่อ /allowDelete:ถูกระบุ ไฟล์ใดๆ ที่มีอยู่ในโฟลเดอร์ที่ระบุโดยพารามิเตอร์โฟลเดอร์ที่ไม่ได้คาดหวังจะถูกลบโดยอัตโนมัติ เมื่อมีการระบุ /allowDelete:No จะไม่มีการลบเกิดขึ้น เมื่อ /allowDelete:ถูกระบุ ผู้ใช้จะได้รับแจ้งผ่านคอนโซลเพื่ออนุญาตหรือปฏิเสธการลบทั้งหมด หากมีการระบุ /allowWrite:No จะไม่มีการลบเกิดขึ้นแม้จะมีการระบุ /allowDelete:Yes ด้วยก็ตาม
/clobber เลือกได้ อาร์กิวเมนต์นี้ใช้ระหว่างการแยกเท่านั้น เมื่อระบุ /clobber ไฟล์ที่มีชุดคุณลักษณะอ่านอย่างเดียวจะถูกเขียนทับหรือลบทิ้ง เมื่อไม่ระ ไฟล์ที่มีชุดคุณลักษณะอ่านอย่างเดียวจะไม่ถูกเขียนทับหรือลบทิ้ง
/errorlevel: {Off|Error|Warning|Info|Verbose} ไม่บังคับ ค่าเริ่มต้นคือ ข้อมูล อาร์กิวเมนต์นี้ระบุระดับของการบันทึกข้อมูลไปยังเอาต์พุต
/map: <file path> ไม่บังคับ พาธและชื่อของไฟล์ .xml ที่มีคำสั่งการแมปไฟล์ เมื่อใช้ระหว่างการแตกไฟล์ โดยทั่วไปไฟล์ที่อ่านจากภายในโฟลเดอร์ที่ระบุโดยพารามิเตอร์ /folder จะถูกอ่านจากตำแหน่งอื่นตามที่ระบุในไฟล์การจับคู่ ในระหว่างการดำเนินการแพค ไฟล์ที่ตรงกับคำสั่งจะไม่ถูกเขียน
/nologo ไม่บังคับ หยุดแบนเนอร์ในขณะใช้งานจริง
/บันทึก: <พาธไฟล์> ไม่บังคับ พาธและชื่อไปยังไฟล์บันทึก หากไฟล์มีอยู่แล้ว ข้อมูลการบันทึกใหม่จะถูกผนวกเข้ากับไฟล์
@ <พาธของไฟล์> ไม่บังคับ พาธและชื่อไปยังไฟล์ที่มีอาร์กิวเมนต์บรรทัดคำสั่งสำหรับเครื่องมือ
/sourceLoc: <สตริง> ไม่บังคับ อาร์กิวเมนต์นี้สร้างไฟล์ทรัพยากรแมม่แบบและใช้ได้กับการแยกเท่านั้น

ค่าที่เป็นไปได้คือ auto หรือรหัส LCID / ISO สำหรับภาษาที่คุณต้องการส่งออก เมื่อใช้อาร์กิวเมนต์นี้ทรัพยากรสตริงจากสถานที่ที่กำหนดจะถูกแยกเป็นไฟล์ .resx ที่เป็นกลาง ถ้า auto หรือระบุสวิตช์แบบยาวหรือสั้นสวิตช์ ตำแหน่งที่ตั้งฐานหรือโซลูชันจะถูกใช้ คุณสามารถใช้รูปแบบย่อของคำสั่ง: /src
/localize เลือกได้ แยกหรือรวมทรัพยากรสตริงทั้งหมดลงในไฟล์ .resx คุณสามารถใช้รูปแบบย่อของคำสั่ง: /loc ตัวเลือกแปลเป็นภาษาท้องถิ่น สนับสนุนส่วนประกอบที่ใช้ร่วมกันสำหรับไฟล์ .resx ข้อมูลเพิ่มเติม: การใช้ทรัพยากรบนเว็บ RESX

ใช้อาร์กิวเมนต์คำสั่ง /map

การสนทนาต่อไปนี้มีรายละเอียดการใช้อาร์กิวเมนต์ /map ไปยังเครื่องมือ SolutionPackager

ไฟล์ที่สร้างขึ้นในระบบบิลด์อัตโนมัติ เช่น ไฟล์ .xap Silverlight และแอสเซมบลีปลั๊กอิน มักไม่ถูกตรวจสอบในการควบคุมต้นทาง ทรัพยากรบนเว็บอาจมีอยู่ในแหล่งควบคุมต้นทางในสถานที่ที่ไม่เข้ากันโดยตรงกับเครื่องมือ SolutionPackager โดยการรวมพารามิเตอร์ /map เครื่องมือ SolutionPackager สามารถนำไปอ่านและทำแพคเกจไฟล์ดังกล่าวจากตำแหน่งอื่น และไม่ได้อยู่ในโฟลเดอร์ Extract ดังที่ปกติแล้วจะทำ พารามิเตอร์ /map ต้องระบุชื่อและพาธไปยังไฟล์ XML ที่มีคำสั่งการแมป คำสั่งเหล่านั้นจะสั่งให้ SolutionPackager จับคู่ไฟล์ตามชื่อและพาธ และระบุตำแหน่งอื่นเพื่อค้นหาไฟล์ที่ตรงกัน ข้อมูลต่อไปนี้ใช้กับคำสั่งทั้งหมดอย่างเท่าเทียมกัน

  • คำสั่งหลายรายการอาจมีการระบุไว้รวมถึงคำสั่งที่จะจับคู่ไฟล์ที่เหมือนกัน คำสั่งที่ระบุไว้ในไฟล์จะมีความสำคัญมากกว่าคำสั่งที่ระบุไว้ในภายหลัง

  • หากไฟล์ถูกจับคู่กับคำสั่งใด ๆ จะต้องพบไฟล์นั้นในตำแหน่งอื่นอย่างน้อยหนึ่งตำแหน่ง หากไม่พบทางเลือกที่ตรงกัน SolutionPackager จะส่งข้อผิดพลาด

  • พาธโฟลเดอร์และไฟล์อาจเป็นแบบสัมบูรณ์หรือแบบสัมพัทธ์ พาธสัมพัทธ์จะถูกประเมินจากโฟลเดอร์ที่ระบุโดยพารามิเตอร์ /folder เสมอ

  • ตัวแปรของสภาพแวดล้อมอาจถูกระบุโดยใช้ syntax %variable%

  • อาจใช้สัญลักษณ์ตัวแทนโฟลเดอร์ “**” เพื่อหมายถึง "ในโฟลเดอร์ย่อยใดๆ" ซึ่งสามารถใช้เป็นส่วนสุดท้ายของเส้นทาง ตัวอย่างเช่น: “c:\folderA\**”

  • อักขระตัวแทนชื่อไฟล์สามารถใช้ได้เฉพาะในรูปแบบ "*.ext" หรือ “*.*” ไม่รองรับรูปแบบอื่น

    การแมปคำสั่งทั้งสามประเภทมีการอธิบายไว้ที่นี่พร้อมด้วยตัวอย่างที่แสดงวิธีใช้

การแมปโฟลเดอร์

ข้อมูลต่อไปนี้ให้ข้อมูลรายละเอียดเกี่ยวกับการแมปโฟลเดอร์

รูปแบบ Xml

<Folder map="folderA" to="folderB" />

คำอธิบาย

พาธของไฟล์ที่ตรงกับ "folderA" จะเปลี่ยนเป็น "folderB"

  • ลำดับชั้นของโฟลเดอร์ย่อยแต่ละอันจะต้องตรงกันทุกประการ

  • ไม่รองรับสัญลักษณ์แทนโฟลเดอร์

  • อาจไม่มีการระบุชื่อไฟล์

    ตัวอย่าง

    <Folder map="folderA" to="folderB" />  
    <Folder map="folderA\folderB" to="..\..\folderC\" />  
    <Folder map="WebResources\subFolder" to="%base%\WebResources" />  
    

การแมปไฟล์ไปที่ไฟล์

ข้อมูลต่อไปนี้ให้รายละเอียดเพิ่มเติมเกี่ยวกับการแมปไฟล์กับไฟล์

รูปแบบ Xml

<FileToFile map="path\filename.ext" to="path\filename.ext" />

คำอธิบาย

ไฟล์ใดก็ได้ที่ตรงกับพารามิเตอร์ map จะถูกอ่านจากชื่อและพาธที่ระบุในพารามิเตอร์ to

สำหรับพารามิเตอร์ map:

  • ต้องระบุชื่อไฟล์ พาธเป็นทางเลือก หากไม่ระบุพาธ ไฟล์จากโฟลเดอร์ใดๆ อาจถูกจับคู่

  • ไม่รองรับสัญลักษณ์แทนชื่อไฟล์

  • สนับสนุนสัญลักษณ์ตัวแทนโฟลเดอร์

    สำหรับพารามิเตอร์ to:

  • ต้องระบุชื่อไฟล์และพาธ

  • ชื่อไฟล์อาจแตกต่างจากชื่อในพารามิเตอร์ map

  • ไม่รองรับสัญลักษณ์แทนชื่อไฟล์

  • สนับสนุนสัญลักษณ์ตัวแทนโฟลเดอร์

ตัวอย่าง

  <FileToFile map="assembly.dll" to="c:\path\folder\assembly.dll" />  
  <FileToFile map="PluginAssemblies\**\this.dll" to="..\..\Plugins\**\that.dll" />  
  <FileToFile map="Webresrouces\ardvark.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\aardvark.jpg" />  
  <FileToFile
    map="pluginpackages\cr886_PluginPackageTest\package\cr886_PluginPackageTest.nupkg"
    to="myplg\bin\Debug\myplg.1.0.0.nupkg" /> 

โปรดทราบว่าใน ตัวอย่างแพคเกจ NuGet ด้านบน cr886_PluginPackageTest.nupkg จะไม่ถูกเขียนทับหากไฟล์มีอยู่แล้วในตำแหน่งที่ระบุ

หารแมปไฟล์ไปที่พาธ

ต่อไปนี้ให้ข้อมูลรายละเอียดเกี่ยวกับการแมปไฟล์ไปที่พาธ

รูปแบบ Xml

<FileToPath map="path\filename.ext" to="path" />

คำอธิบาย

ไฟล์ใดก็ได้ที่ตรงกับพารามิเตอร์ map ถูกอ่านจากพาธที่ระบุในพารามิเตอร์ to

สำหรับพารามิเตอร์ map:

  • ต้องระบุชื่อไฟล์ พาธเป็นทางเลือก หากไม่ระบุพาธ ไฟล์จากโฟลเดอร์ใดๆ อาจถูกจับคู่

  • รองรับสัญลักษณ์แทนชื่อไฟล์

  • สนับสนุนสัญลักษณ์ตัวแทนโฟลเดอร์

สำหรับพารามิเตอร์ to:

  • ต้องระบุพาธ

  • สนับสนุนสัญลักษณ์ตัวแทนโฟลเดอร์

  • ไม่ต้องระบุชื่อไฟล์

    ตัวอย่าง

  <FileToPath map="assembly.dll" to="c:\path\folder" />  
  <FileToPath map="PluginAssemblies\**\this.dll" to="..\..\Plugins\bin\**" />  
  <FileToPath map="*.jpg" to="%SRCBASE%\CrmPackage\WebResources\JPG format\" />  
  <FileToPath map="*.*" to="..\..\%ARCH%\%TYPE%\drop" />  

ตัวอย่างการแมป

ตัวอย่างโค้ด XML ต่อไปนี้แสดงไฟล์การจับคู่ที่สมบูรณ์ ซึ่งเปิดใช้งานเครื่องมือ SolutionPackager เพื่ออ่านทรัพยากรเว็บใดๆ และแอสเซมบลีที่สร้างเริ่มต้นสองรายการ จากโครงการ Developer Toolkit ที่ชื่อ CRMDevTookitSample

<?xml version="1.0" encoding="utf-8"?>  
<Mapping>  
       <!-- Match specific named files to an alternate folder -->  
       <FileToFile map="CRMDevTookitSamplePlugins.dll" to="..\..\Plugins\bin\**\CRMDevTookitSample.plugins.dll" />  
       <FileToFile map="CRMDevTookitSampleWorkflow.dll" to="..\..\Workflow\bin\**\CRMDevTookitSample.Workflow.dll" />  
       <!-- Match any file in and under WebResources to an alternate set of sub-folders -->  
       <FileToPath map="WebResources\*.*" to="..\..\CrmPackage\WebResources\**" />  
       <FileToPath map="WebResources\**\*.*" to="..\..\CrmPackage\WebResources\**" />  
</Mapping>  

โซลูชันที่มีการจัดการและที่ไม่มีการจัดการ

ไฟล์โซลูชัน Dataverse ที่บีบอัด (.zip) สามารถส่งออกในหนึ่งในสองประเภทดังที่แสดงไว้ที่นี่

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

โซลูชันที่ไม่มีการจัดการ
โซลูชันแบบเปิดที่ไม่มีข้อจำกัดเกี่ยวกับสิ่งที่สามารถเพิ่ม เอาออก หรือแก้ไขได้ แนะนำในระหว่างการพัฒนาโซลูชัน

รูปแบบของไฟล์โซลูชันที่ถูกบีบอัดจะแตกต่างกันไปตามประเภทของไฟล์ ไม่ว่าจะถูกจัดการหรือไม่มีการจัดการ SolutionPackager สามารถประมวลผลไฟล์โซลูชันที่บีบอัดได้ทั้งสองประเภท อย่างไรก็ตาม เครื่องมือไม่สามารถแปลงประเภทหนึ่งเป็นประเภทอื่นได้ วิธีเดียวที่จะแปลงไฟล์โซลูชันเป็นประเภทอื่น เช่น จากที่ไม่มีการจัดการเป็นการจัดการ คือการนำเข้าไฟล์ .zip ที่ไม่มีการจัดการโซลูชันไปยังเซิร์ฟเวอร์ Dataverse จากนั้นส่งออกโซลูชันเป็น โซลูชันที่มีการจัดการ

SolutionPackager สามารถประมวลผลไฟล์ที่ไม่มีการจัดการและโซลูชันที่มีการจัดการ .zip เป็นชุดรวมผ่าน /PackageType: ทั้งสองพารามิเตอร์ ในการดำเนินการนี้ มีความจำเป็นต้องส่งออกโซลูชันของคุณสองครั้ง ตามประเภทการตั้งชื่อไฟล์ .zip ดังนี้

ไฟล์ .zip ที่ไม่มีการจัดการ: AnyName.zip ไฟล์ .zip ที่มีการจัดการ: AnyName_managed.zip

เครื่องมือจะสมมติว่ามีไฟล์ zip ที่มีการจัดการในโฟลเดอร์เดียวกันกับไฟล์ที่ไม่มีการจัดการ และแยกไฟล์ทั้งสองเป็นโฟลเดอร์เดียว เพื่อรักษาความแตกต่างที่มีส่วนประกอบที่ได้รับการจัดการและไม่มีการจัดการอยู่

หลังจากแยกโซลูชันเป็นแบบไม่มีการจัดการและจัดการแล้ว เป็นไปได้จากโฟลเดอร์เดียวที่จะแพคทั้งสองหรือแต่ละชนิดแยกกันโดยใช้พารามิเตอร์ /PackageType เพื่อระบุประเภทที่จะสร้าง เมื่อระบุทั้งสองไฟล์ จะมีการสร้างไฟล์ .zip ทั้งสองไฟล์โดยใช้หลักการตั้งชื่อดังกล่าว หากพารามิเตอร์ /PackageType หายไปเมื่อทำการแพคจากโฟลเดอร์ที่มีการจัดการและไม่ได้รับการจัดการแบบคู่ ค่าเริ่มต้นคือการสร้างไฟล์ .zip แบบไม่มีการจัดการ ไฟล์เดียว

การแก้ไขปัญหา

ถ้าคุณใช้ Visual Studio เพื่อแก้ไขไฟล์ทรัพยากรที่สร้างโดยตัวแก้ปัญหาแพคเกจคุณอาจได้รับข้อความเมื่อคุณแพคที่คล้ายกันนี้: “Failed to determine version id of the resource file <filename>.resx the resource file must be exported from the solutionpackager.exe tool in order to be used as part of the pack process.” สิ่งนี้เกิดขึ้นเพราะ Visual Studio แทนที่แท็กข้อมูลเมตาของไฟล์ทรัพยากรด้วยแท็กข้อมูล

การแก้ไข

  1. เปิดไฟล์ทรัพยากรในตัวแก้ไขข้อความที่คุณโปรดปราน และค้นหาและอัพเดตแท็กต่อไปนี้:

    <data name="Source LCID" xml:space="preserve">  
    <data name="Source file" xml:space="preserve">  
    <data name="Source package type" xml:space="preserve">  
    <data name="SolutionPackager Version" mimetype="application/x-microsoft.net.object.binary.base64">  
    
    
  2. เปลี่ยนชื่อโหนดจาก <data> เป็น <metadata>

    ตัวอย่าง สตริงนี้:

    <data name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </data>  
    
    

    เปลี่ยนเป็น:

    <metadata name="Source LCID" xml:space="preserve">  
      <value>1033</value>  
    </metadata>  
    
    

    สิ่งนี้อนุญาตให้ Solution Packager อ่านและนำเข้าไฟล์ทรัพยากร ปัญหานี้เกิดขึ้นเมื่อใช้งานตัวแก้ไขทรัพยากร Visual Studio

ดูเพิ่มเติม

ใช้ตัวควบคุมต้นทางที่มีไฟล์โซลูชัน

แนวคิดของโซลูชัน