เครื่องมือ SolutionPackager
SolutionPackager เป็นเครื่องมือที่สามารถย่อยไฟล์โซลูชันที่บีบอัดของ Microsoft Dataverse ไปเป็นไฟล์ XML หลายๆ ไฟล์ และไฟล์อื่นๆ จากนั้นคุณสามารถจัดการไฟล์เหล่านี้ได้อย่างง่ายดายโดยใช้ระบบควบคุมแหล่งที่มา ส่วนต่อไปนี้แสดงวิธีเรียกใช้เครื่องมือและวิธีใช้เครื่องมือด้วยโซลูชันที่มีการจัดการและไม่มีการจัดการ
สำคัญ
เครื่องมือ SolutionPackager ไม่ใช่วิธีที่แนะนำในการแยกและบรรจุโซลูชันอีกต่อไป ความสามารถของเครื่องมือ SolutionPackager ได้รวมอยู่ใน Power Platform CLI คำสั่ง pac solution
มีคำกริยาจำนวนหนึ่ง ได้แก่ unpack
, pack
, clone
และ sync
ที่รวมเอาความสามารถพื้นฐานเดียวกันของเครื่องมือ SolutionPackager
จะหาเครื่องมือ SolutionPackager ได้ที่ไหน
เครื่องมือ SolutionPackager จะถูกแจกจ่ายเป็นส่วนหนึ่งของแพ็คเกจ Microsoft.CrmSdk.CoreTools NuGet ในการติดตั้งโปรแกรม ให้ทำตามขั้นตอนเหล่านี้
- ดาวน์โหลดแพคเกจ NuGet
- เปลี่ยนชื่อนามสกุลไฟล์แพคเกจจาก .nupkg เป็น .zip
- แตกเนื้อหาของไฟล์ 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:Yes ถูกระบุ ไฟล์ใดๆ ที่มีอยู่ในโฟลเดอร์ที่ระบุโดยพารามิเตอร์โฟลเดอร์ที่ไม่ได้คาดหวังจะถูกลบโดยอัตโนมัติ เมื่อมีการระบุ /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 subfolders -->
<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 แทนที่แท็กข้อมูลเมตาของไฟล์ทรัพยากรด้วยแท็กข้อมูล
การแก้ไข
เปิดไฟล์ทรัพยากรในตัวแก้ไขข้อความที่คุณโปรดปราน และค้นหาและอัพเดตแท็กต่อไปนี้:
<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">
เปลี่ยนชื่อโหนดจาก
<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