แชร์ผ่าน


สร้างแพคเกจสำหรับเครื่องมือ Package Deployer

Package Deployer ช่วยให้ผู้ดูแลสามารถปรับใช้แพคเกจบนอินสแตนซ์ Microsoft Dataverse แพคเกจe Package Deployer สามารถประกอบด้วยรายการต่อไปนี้หนึ่งรายการหรือทั้งหมด:

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

หมายเหตุ

มีแพคเกจอีกประเภทที่เรียกว่า แพคเกจปลั๊กอิน แพคเกจประเภทนั้นมีไว้สำหรับส่วนประกอบที่อิงกับปลั๊กอินและไม่มีความสัมพันธ์กับแพคเกจ Package Deployer

ข้อกำหนดเบื้องต้น

  • ตรวจสอบให้แน่ใจว่าคุณมีโซลูชันและไฟล์อื่นๆ ทั้งหมดที่คุณต้องการรวมไว้ในแพคเกจ
  • Visual Studio 2019 หรือที่ใหม่กว่า หรือ Visual Studio Code

ภาพรวมของกระบวนการ

หากต้องการสร้างแพคเกจ Package Deployer ให้ดำเนินการห้าขั้นตอนต่อไปนี้

  • สร้างโครงการ Visual Studio หรือ MSBuild
  • เพิ่มโซลูชันและไฟล์อื่นๆ ในโครงการ
  • อัปเดตไฟล์ HTML ที่ให้มา (ไม่บังคับ)
  • ระบุค่าการกำหนดค่าสำหรับแพคเกจ
  • กำหนดโค้ดที่กำหนดเองสำหรับแพคเกจ
  • สร้างและปรับใช้งานแพคเกจ

ขั้นตอนเหล่านี้จะมีคำอธิบายโดยละเอียดในบทความนี้

สร้างโครงการแพคเกจ

ขั้นตอนแรกคือการสร้างโครงการ Visual Studio หรือ MSBuild สำหรับแพคเกจ ในการทำเช่นนั้น คุณต้องมีหนึ่งในสองส่วนขยายเครื่องมือที่พร้อมใช้งานติดตั้งบนคอมพิวเตอร์สำหรับการพัฒนาของคุณ หากใช้ Visual Studio Code ให้ติดตั้ง Microsoft Power Platform CLI หรือหากใช้ Visual Studio 2019 ให้ติดตั้ง Power Platform Tools สำหรับ Visual Studio ปัจจุบัน ส่วนขยาย Power Platform Tools ใช้ได้เฉพาะกับ Visual Studio 2019 เท่านั้น อย่างไรก็ตาม โครงการที่สร้างขึ้นสามารถสร้างได้โดยใช้ Visual Studio 2019 หรือที่ใหม่กว่า

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

เรียกใช้คำสั่ง pac package init เพื่อสร้างแพคเกจเริ่มต้น ข้อมูลเพิ่มเติม: pac package

pac package init help
pac package init --outputDirectory DeploymentPackage

เอาต์พุต CLI ที่เป็นผลลัพธ์ประกอบด้วยโฟลเดอร์และไฟล์ที่แสดงด้านล่าง ชื่อโฟลเดอร์ "DeploymentPackage" มีการใช้ที่นี่เป็นตัวอย่าง

C:.
└───DeploymentPackage
    │   DeploymentPackage.csproj
    │   PackageImportExtension.cs
    │
    └───PkgAssets
            ImportConfig.xml
            manifest.ppkg.json

ในโครงการที่สร้างขึ้น ให้ค้นหาไฟล์การกำหนดค่า ImportConfig.xml ในโฟลเดอร์ PkgAssets และไฟล์ PackageImportExtension.cs คุณจะแก้ไขไฟล์เหล่านี้ตามที่อธิบายไว้ในบทความนี้

เพิ่มไฟล์แพคเกจ

หลังจากที่คุณสร้างโครงการแพคเกจ คุณสามารถเริ่มเพิ่มโซลูชันและไฟล์อื่นๆ ในโครงการนั้นได้

เมื่อใช้ CLI คุณสามารถเพิ่มแพคเกจภายนอก โซลูชัน และข้อมูลอ้างอิงในโครงการแพคเกจของคุณโดยใช้คำสั่งย่อย เพิ่ม ป้อน pac package help เพื่อดูรายการคำสั่งย่อย มาเพิ่มโซลูชันลงในแพคเกจของเรากัน

> pac package add-solution help

Commands:
Usage: pac package add-solution --path [--import-order] [--skip-validation] [--publish-workflows-activate-plugins] [--overwrite-unmanaged-customizations] [--import-mode] [--missing-dependency-behavior] [--dependency-overrides]

> cd .\DeploymentPackage\
> pac package add-solution --path ..\TestSolution_1_0_0_1_managed.zip

The item was added successfully.

กำหนดค่าแพคเกจ

  1. กำหนดการกำหนดค่าแพคเกจโดยเพิ่มข้อมูลเกี่ยวกับแพคเกจของคุณในไฟล์ ImportConfig.xml ในโครงการ เปิดไฟล์เพื่อแก้ไข รายการต่อไปนี้ให้ข้อมูลเกี่ยวกับแต่ละพารามิเตอร์และโหนดในไฟล์ปรับแต่ง

    installsampledata
    True หรือ false ถ้า true ติดตั้งข้อมูลตัวอย่างไปที่อินสแตนซ์ Dataverse ข้อมูลนี้เป็นข้อมูลตัวอย่างเดียวกับที่คุณสามารถติดตั้งได้จากพื้นที่ การตั้งค่า>การจัดการข้อมูล ใน Dataverse

    waitforsampledatatoinstall
    จริง หรือ เท็จ ถ้า จริง และถ้า installsampledata ถูกตั้งค่าเป็น จริง รอข้อมูลตัวอย่างที่จะติดตั้งก่อนที่จะปรับใช้แพคเกจ

    หมายเหตุ

    ตรวจสอบให้แน่ใจว่าคุณตั้งค่า installsampledata เป็นจริง หากคุณกำลังตั้งค่า waitforsampledatatoinstall เป็น จริง

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

    แอตทริบิวต์นี้มักใช้ในการสร้างแพคเกจสำหรับ Unified Service Desk สำหรับ Dynamics 365 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Unified Service Desk ดูที่ คู่มือการจัดการสำหรับ Unified Service Desk สำหรับ Dynamics 3.0

    agentdesktopexename
    ชื่อของไฟล์ .exe หรือ .msi ในไฟล์ zip หรือ URL ที่จะเรียกใช้เมื่อสิ้นสุดกระบวนการปรับใช้

    แอตทริบิวต์นี้มักใช้ในการสร้างแพคเกจสำหรับ Unified Service Desk

    crmmigdataimportfile
    ชื่อไฟล์ของไฟล์ข้อมูลการกำหนดค่าเริ่มต้น (.zip) ที่ส่งออกโดยใช้เครื่องมือการโอนย้ายการตั้งค่าคอนฟิก

    • คุณยังสามารถนำเข้ารุ่นภาษาท้องถิ่นของไฟล์ข้อมูลการกำหนดค่าโดยยึดตามรหัสตำแหน่งที่ตั้ง (LCID) ที่ระบุ โดยใช้การตั้งค่ารันไทม์ใหม่ในขณะที่รัน Package Deployer ใช้โหนด <cmtdatafile> (อธิบายในภายหลัง) เพื่อระบุรุ่นที่แปลเป็นภาษาท้องถิ่นของไฟล์ข้อมูลการกำหนดค่าในแพคเกจ และจากนั้นใช้วิธี OverrideConfigurationDataFileLanguage (อธิบายในภายหลัง) เพื่อระบุตรรกะสำหรับการนำเข้าไฟล์ข้อมูลการกำหนดค่าตามรหัสตำแหน่งที่ตั้งที่ระบุโดยใช้การตั้งค่ารันไทม์ คุณไม่สามารถนำเข้าไฟล์ข้อมูลการกำหนดค่ามากกว่าหนึ่งไฟล์โดยใช้แพคเกจในเวลาเดียวกัน

    • สำหรับ Dataverse (on-premises) หากไฟล์ข้อมูลการกำหนดค่าของคุณมีข้อมูลผู้ใช้ และอินสแตนซ์ Dataverse ต้นทางและเป้าหมายต่างอยู่ใน Active Directory Domain เดียวกัน ข้อมูลผู้ใช้จะถูกนำเข้าสู่อินสแตนซ์ Dataverse เป้าหมาย เมื่อต้องการนำเข้าข้อมูลผู้ใช้ไปยังอินสแตนซ์ Dataverse (ภายในองค์กร) ในโดเมนอื่น คุณต้องรวมไฟล์แผนที่ผู้ใช้ (.xml) ที่สร้างโดยใช้เครื่องมือย้ายการกำหนดค่าในโครงการของคุณ และระบุพร้อมกับไฟล์ข้อมูลการกำหนดค่าโดยใช้แอตทริบิวต์ usermapfilename ในโหนด <cmtdatafile> ที่จะอธิบายในภายหลัง ข้อมูลผู้ใช้ไม่สามารถนำเข้าไปยังอินสแตนซ์ Dataverse ได้
      <solutions> โหนด
      มีอาร์เรย์ของโหนด <configsolutionfile> ที่อธิบายโซลูชันที่จะนำเข้า ลำดับของโซลูชันภายใต้โหนดนี้ระบุลำดับที่โซลูชันจะถูกนำเข้าบนอินสแตนซ์ Dataverse เป้าหมาย

      <configsolutionfile> โหนด
      ใช้โหนดนี้ภายใต้โหนด <solutions> เพื่อระบุแต่ละโซลูชันและข้อมูลต่อไปนี้สำหรับแต่ละโซลูชันที่ต้องนำเข้า:

    • solutionpackagefilename: ระบุชื่อไฟล์ .zip ของโซลูชันของคุณ จำเป็น

    • overwriteunmanagedcustomizations: ระบุว่าจะเขียนทับการกำหนดเองที่ไม่มีการจัดการใดๆ หรือไม่ เมื่อนำเข้าโซลูชันที่มีอยู่แล้วในอินสแตนซ์ Dynamics 365 เป้าหมาย แอตทริบิวต์นี้เป็นทางเลือก และหากคุณไม่ได้ระบุแอตทริบิวต์นี้ โดยตามค่าเริ่มต้นการปรับแต่งที่ไม่ได้รับการจัดการในโซลูชันที่มีอยู่จะอยู่บนอินสแตนซ์ของ Dynamics 365 เป้าหมาย

    • publishworkflowsandactivateplugins: ระบุว่าจะเผยแพร่เวิร์กโฟลว์และเปิดใช้งานปลั๊กอินในอินสแตนซ์ Dynamics 365 เป้าหมายหลังจากนำเข้าโซลูชันหรือไม่ แอตทริบิวต์นี้เป็นทางเลือก และถ้าคุณไม่ระบุไม่ได้ระบุแอตทริบิวต์นี้ โดยตามค่าเริ่มต้น เวิร์กโฟลว์จะถูกเผยแพร่และปลั๊กอินจะถูกเปิดใช้งาน หลังจากที่โซลูชันถูกนำเข้าบนอินสแตนซ์ Dynamics 365 เป้าหมาย

      คุณสามารถเพิ่มชื่อไฟล์โซลูชันหลายชื่อในแพคเกจได้โดยเพิ่มหลายโหนด <configsolutionfile> ตัวอย่างเช่น หากคุณต้องการนำเข้าไฟล์โซลูชันสามไฟล์ ให้เพิ่มดังที่แสดงได้ล่าง:

    
    <solutions>  
    <configsolutionfile solutionpackagefilename="SampleSolutionOne_1_0_managed.zip"  
    overwriteunmanagedcustomizations="false"  
    publishworkflowsandactivateplugins="true"/>  
    <configsolutionfile solutionpackagefilename="SampleSolutionTwo_1_0_managed.zip"  
    overwriteunmanagedcustomizations="false"  
    publishworkflowsandactivateplugins="true"/>  
    <configsolutionfile solutionpackagefilename="SampleSolutionThree_1_0_managed.zip" />  
    </solutions>  
    
    

    <filestoimport> โหนด
    มีอาร์เรย์เป็นโหนด <configimportfile> และ <zipimportdetails> ที่ใช้เพื่ออธิบายไฟล์แต่ละไฟล์และไฟล์ zip ตามลำดับที่จะนำเข้า

    <configimportfile> โหนด
    ใช้โหนดนี้ภายใต้โหนด <configimportfile> เพื่ออธิบายไฟล์ที่จะนำเข้าไปยัง Dataverse คุณสามารถเพิ่มไฟล์หลายไฟล์ในแพคเกจได้โดยเพิ่มหลายโหนด <configimportfile>

    
    <filestoimport>  
    <configimportfile filename="File.csv"  
    filetype="CSV"  
    associatedmap="FileMap"  
    importtoentity="FileEntity"  
    datadelimiter=""  
    fielddelimiter="comma"  
    enableduplicatedetection="true"  
    isfirstrowheader="true"  
    isrecordownerateam="false"  
    owneruser=""  
    waitforimporttocomplete="true" />  
    <configimportfile filename="File.zip"  
    filetype="ZIP"  
    associatedmap="FileMapName"  
    importtoentity="FileEntity"  
    datadelimiter=""  
    fielddelimiter="comma"  
    enableduplicatedetection="true"  
    isfirstrowheader="true"  
    isrecordownerateam="false"  
    owneruser=""  
    waitforimporttocomplete="true"/>  
    
    </filestoimport>  
    
    

    รายการด้านล่างคือแอตทริบิวต์ที่รองรับ:

    แอตทริบิวต์ Description
    filename ชื่อของไฟล์ที่มีข้อมูลการนำเข้า หากไฟล์นั้นเป็นไฟล์ .zip โหนด <zipimportdetails> ต้องมีโหนด <zipimportdetail> สำหรับแต่ละไฟล์ในไฟล์ .zip
    filetype ค่านี้อาจเป็น csv, xml หรือ zip
    associatedmap ชื่อของ Dataverse นำเข้าแผนผังข้อมูลเพื่อใช้กับไฟล์นี้ หากว่างเปล่า พยายามใช้ระบบกำหนดชื่อแผนผังข้อมูลการนำเข้าสำหรับไฟล์นี้
    importtoentity สามารถเป็นชื่อของไฟล์ exe ในไฟล์ zip หรือ URL หรือไฟล์ .ms เพื่อให้ลิงก์สำหรับเรียกใช้เมื่อสิ้นสุดกระบวนการ
    datadelimiter ชื่อของตัวคั่นข้อมูลที่ใช้ในไฟล์นำเข้า ค่าที่ถูกต้องคือ เครื่องหมายอัญประกาศเดี่ยวและอัญประกาศคู่
    fielddelimiter ชื่อของตัวคั่นฟิลด์ที่ใช้ในไฟล์นำเข้า ค่าที่ถูกต้องคือ เครื่องหมายจุลภาคหรือจุดคู่ หรืออัญประกาศเดี่ยว
    enableduplicatedetection ระบุว่าให้เปิดใช้งานกฏการตรวจหารายการซ้ำในการนำเข้าข้อมูลหรือไม่ ค่าที่ถูกต้องเป็น true หรือ false
    isfirstrowheader ใช้เพื่อแสดงว่าแถวแรกของไฟล์นำเข้ามีชื่อฟิลด์ ค่าที่ใช้ได้คือ true หรือ false
    isrecordownerateam ระบุว่าเจ้าของเรกคอร์ดที่นำเข้าควรเป็นทีมหรือไม่ ค่าที่ใช้ได้คือ true หรือ false
    owneruser ระบุรหัสผู้ใช้ที่ควรเป็นเจ้าของเรกคอร์ด ค่าเริ่มต้นคือ ผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน
    waitforimporttocomplete ถ้า true ระบบจะรอให้การนำเข้าเสร็จสมบูรณ์ก่อนดำเนินการต่อ ถ้า false จะจัดคิวงานและทำต่อไป

    <zipimportdetails> โหนด
    โหนดนี้มีอาร์เรย์ของโหนด <zipimportdetail> ที่อธิบายไฟล์ที่รวมอยู่ในไฟล์ zip ที่ใช้เพื่อนำเข้าสู่ Dynamics 365

    <zipimportdetail> โหนด
    ใช้โหนดนี้ภายใต้โหนด <zipimportdetails> เพื่อจัดเตรียมข้อมูลเกี่ยวกับแต่ละไฟล์ในไฟล์ .zip ที่ระบุในโหนด <configimportfile>

    <filestoimport>  
    ...  
    ...  
    <zipimportdetails>  
    <zipimportdetail filename="subfile1.csv" filetype="csv" importtoentity="account" />  
    <zipimportdetail filename="subfile2.csv" filetype="csv" importtoentity="contact" />  
    </zipimportdetails>  
    </filestoimport>  
    
    

    แอตทริบิวต์ที่รองรับมีการแสดงไว้ด้านล่าง:

    แอตทริบิวต์ Description
    filename ชื่อของไฟล์ที่มีข้อมูลการนำเข้า
    filetype ค่านี้อาจเป็น csv หรือ xml
    importtoentity สามารถเป็นชื่อของไฟล์ exe ในไฟล์ zip หรือ URL หรือไฟล์ .ms เพื่อให้ลิงก์สำหรับเรียกใช้เมื่อสิ้นสุดกระบวนการ

    <filesmapstoimport> โหนด
    โหนดนี้มีอาร์เรย์ของโหนด <configmapimportfile> ที่จะนำเข้า ลำดับของไฟล์แผนผังในโหนดนี้บ่งบอกถึงลำดับการนำเข้า สำหรับข้อมูลเกี่ยวกับการแผนผังข้อมูล ดูที่ สร้างแผนผังข้อมูลเพื่อนำเข้า

    <configimportmapfile> โหนด
    ใช้โหนดนี้ภายใต้โหนด <filesmapstoimport> เพื่อให้ข้อมูลเกี่ยวกับไฟล์แผนผังแต่ละไฟล์ที่จะนำเข้า Dataverse

    <filesmapstoimport>  
    <configimportmapfile filename="FileMap.xml" />  
    </filesmapstoimport>  
    

    <cmtdatafiles> โหนด
    โหนดนี้มีอาร์เรย์ของโหนด <cmtdatafile> ที่มีไฟล์ข้อมูลการกำหนดค่าเวอร์ชันที่แปลแล้วที่จะถูกนำเข้า

    <cmtdatafile> โหนด
    ใช้โหนดนี้ภายใต้โหนด <cmtdatafiles> เพื่อระบุไฟล์ข้อมูลการกำหนดค่าที่แปลแล้ว พร้อมกับรหัสตำแหน่งที่ตั้ง (จำเป็น) และไฟล์แผนผังข้อมูลผู้ใช้ (ตัวเลือกเพิ่มเติม) ตัวอย่างเช่น:

    <cmtdatafiles>  
    <cmtdatafile filename="data_1033.zip" lcid="1033" usermapfilename="UserMap.xml" />  
    <cmtdatafile filename="data_1041.zip" lcid="1041" usermapfilename="" />  
    </cmtdatafiles>  
    

    คุณสามารถกำหนดตรรกะที่กำหนดเองของคุณในวิธี OverrideConfigurationDataFileLanguage (อธิบายในภายหลัง) เพื่อนำเข้าไฟล์ข้อมูลการกำหนดค่าที่แปลแล้วแทนหนึ่งไฟล์ค่าเริ่มต้น (ระบุใน crmmigdataimportfile) ตามค่ารหัสตำแหน่งที่ตั้ง (LCID) ที่ระบุโดยใช้การตั้งค่ารันไทม์ (อธิบายในภายหลัง)

  2. เลือก บันทึกทั้งหมด

    xml ต่อไปนี้แสดงถึงเนื้อหาของไฟล์ ImportConfig.xml ตัวอย่าง

    <?xml version="1.0" encoding="utf-16"?>  
    <configdatastorage xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"  
    xmlns:xsd="https://www.w3.org/2001/XMLSchema"  
    installsampledata="true"  
    waitforsampledatatoinstall="true"  
    agentdesktopzipfile=""  
    agentdesktopexename=""  
    crmmigdataimportfile="data_1033.zip">  
    <solutions>  
    <configsolutionfile solutionpackagefilename="SampleSolutionOne_1_0_managed.zip"  
    overwriteunmanagedcustomizations="false"  
    publishworkflowsandactivateplugins="true"/>  
    <configsolutionfile solutionpackagefilename="SampleSolutionTwo_1_0_managed.zip"  
    overwriteunmanagedcustomizations="false"  
    publishworkflowsandactivateplugins="true"/>  
    <configsolutionfile solutionpackagefilename="SampleSolutionThree_1_0_managed.zip" />  
    </solutions>  
    <filestoimport>  
    <configimportfile filename="SampleOption.csv"  
    filetype="CSV"  
    associatedmap="SampleOption"  
    importtoentity="sample_option"  
    datadelimiter=""  
    fielddelimiter="comma"  
    enableduplicatedetection="true"  
    isfirstrowheader="true"  
    isrecordownerateam="false"  
    owneruser=""  
    waitforimporttocomplete="false"/>  
    <configimportfile filename="File.zip"  
    filetype="ZIP"  
    associatedmap="FileMapName"  
    importtoentity="FileEntity"  
    datadelimiter=""  
    fielddelimiter="comma"  
    enableduplicatedetection="true"  
    isfirstrowheader="true"  
    isrecordownerateam="false"  
    owneruser=""  
    waitforimporttocomplete="true"/>  
    <zipimportdetails>  
    <zipimportdetail filename="subfile1.csv"  
    filetype="csv"  
    importtoentity="account" />  
    <zipimportdetail filename="subfile2.csv"  
    filetype="csv"  
    importtoentity="contact" />  
    </zipimportdetails>  
    </filestoimport>  
    <filesmapstoimport>  
    <configimportmapfile filename="SampleOption.xml" />  
    </filesmapstoimport>  
    <cmtdatafiles>  
    <cmtdatafile filename="data_1033.zip"  
    lcid="1033"  
    usermapfilename="UserMap.xml" />  
    <cmtdatafile filename="data_1041.zip"  
    lcid="1041"  
    usermapfilename="" />  
    </cmtdatafiles>  
    </configdatastorage>  
    
    

เพิ่มโค้ดแบบกำหนดเอง

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

  1. แก้ไขไฟล์ PackageTemplate.cs (หรือ PackageImportExtension.cs) ในโฟลเดอร์รากของโครงการ

  2. ในไฟล์ C# คุณสามารถ:

    1. ป้อนรหัสที่กำหนดเองเพื่อดำเนินการ เมื่อมีการเริ่มต้นแพคเกจในนิยามวิธีการแทนที่ของ InitializeCustomExtension

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

      ตัวอย่างเช่น รหัสตัวอย่างต่อไปนี้เปิดใช้งานพารามิเตอร์รันไทม์ที่เรียกว่า SkipChecks สำหรับแพคเกจที่มีค่าสองค่าที่เป็นไปได้: จริงหรือเท็จ รหัสตัวอย่างตรวจสอบว่าผู้ใช้ระบุพารามิเตอร์รันไทม์ใดๆ ขณะทำงาน Package Deployer หรือไม่ (โดยใช้บรรทัดคำสั่งหรือ PowerShell) จากนั้นจึงประมวลผลข้อมูล หากไม่มีการระบุพารามิเตอร์รันไทม์โดยผู้ใช้ขณะรันแพกเกจ ค่าของคุณสมบัติ RuntimeSettings จะเป็นโมฆะ

      public override void InitializeCustomExtension()  
      {  
      // Do nothing.  
      
      // Validate the state of the runtime settings object.  
      if (RuntimeSettings != null)  
      {  
      PackageLog.Log(string.Format("Runtime Settings populated.  Count = {0}", RuntimeSettings.Count));  
      foreach (var setting in RuntimeSettings)  
      {  
      PackageLog.Log(string.Format("Key={0} | Value={1}", setting.Key, setting.Value.ToString()));  
      }  
      
      // Check to see if skip checks is present.  
      if ( RuntimeSettings.ContainsKey("SkipChecks") )  
      {  
      bool bSkipChecks = false;  
      if (bool.TryParse((string)RuntimeSettings["SkipChecks"], out bSkipChecks))  
      OverrideDataImportSafetyChecks = bSkipChecks;  
      }  
      }  
      else  
      PackageLog.Log("Runtime Settings not populated");  
      }  
      

      โค้ดนี้ทำให้ผู้ดูแลระบบใช้บรรทัดคำสั่งหรือ Import-CrmPackage cmdlet เพื่อระบุว่าจะข้ามการตรวจสอบความปลอดภัยในขณะใช้งานเครื่องมือ Package Deployer เพื่อที่จะนำเข้าแพคเกจหรือไม่ ข้อมูลเพิ่มเติม: ปรับใช้งานแพคเกจโดยใช้ Package Deployer และ Windows PowerShell

    2. ป้อนรหัสที่กำหนดเองเพื่อดำเนินการก่อนที่โซลูชันจะถูกนำเข้าในข้อกำหนดวิธีการแทนที่ของ PreSolutionImport เพื่อระบุว่าจะเก็บหรือเขียนทับการกำหนดเองขณะที่อัปเดตโซลูชันที่ระบุในอินสแตนซ์ Dataverse เป้าหมายหรือไม่ และจะเปิดใช้งานปลั๊กอินและเวิร์กโฟลว์โดยอัตโนมัติหรือไม่

    3. ใช้ข้อกำหนดวิธีการแทนที่ของ RunSolutionUpgradeMigrationStep เพื่อทำการแปลงข้อมูลหรืออัปเกรดระหว่างสองเวอร์ชันของโซลูชัน วิธีนี้เรียกใช้เฉพาะเมื่อโซลูชันที่คุณนำเข้ามีอยู่แล้วในอินสแตนซ์ Dataverse เป้าหมาย

      ฟังก์ชันนี้ต้องการพารามิเตอร์ต่อไปนี้:

      พารามิเตอร์ คำอธิบาย
      solutionName ชื่อของโซลูชัน
      oldVersion หมายเลขรุ่นของโซลูชันเก่า
      newVersion หมายเลขรุ่นของโซลูชันใหม่
      oldSolutionId GUID ของโซลูชันเก่า
      newSolutionId GUID ของโซลูชันใหม่
    4. ป้อนรหัสที่กำหนดเองเพื่อดำเนินการก่อนที่โซลูชันจะนำเข้าสำเร็จในนิยามแทนที่ของวิธี BeforeImportStage ข้อมูลตัวอย่างและไฟล์คงที่บางตัวสำหรับโซลูชันที่ระบุในไฟล์ ImportConfig.xml จะถูกนำเข้าก่อนที่การนำเข้าโซลูชันจะเสร็จสิ้น

    5. แทนที่ภาษาที่เลือกในปัจจุบันสำหรับการนำเข้าข้อมูลการกำหนดค่าโดยใช้ข้อกำหนดวิธีการแทนที่ของ OverrideConfigurationDataFileLanguage หากไม่พบรหัสตำแหน่งที่ตั้ง (LCID) ของภาษาที่ระบุในรายการภาษาที่มีในแพคเกจ ไฟล์ข้อมูลเริ่มต้นจะถูกนำเข้า

      คุณระบุภาษาที่มีสำหรับข้อมูลการกำหนดค่าในโหนด <cmtdatafiles> ในไฟล์ ImportConfig.xml ไฟล์การนำเข้าข้อมูลการกำหนดค่าเริ่มต้นถูกระบุในแอตทริบิวต์ crmmigdataimportfile ในไฟล์ ImportConfig.xml

      ข้ามการตรวจสอบข้อมูล (OverrideDataImportSafetyChecks = จริง) สามารถมีผลได้ที่นี่ หากคุณแน่ใจว่าอินสแตนซ์ Dataverse เป้าหมายนั้นไม่มีข้อมูลใด ๆ

    6. ป้อนรหัสที่กำหนดเองเพื่อดำเนินการหลังนำเข้าสำเร็จในนิยามแทนที่ของวิธี AfterPrimaryImport> วิธี ไฟล์คงที่ที่เหลือที่ไม่ได้นำเข้าก่อนหน้านี้ ก่อนการนำเข้าโซลูชันจะเริ่มต้น จะถูกนำเข้าตอนนี้

    7. เปลี่ยนชื่อเริ่มต้นของโฟลเดอร์แพคเกจของคุณเป็นชื่อแพคเกจที่คุณต้องการ หากต้องการทำเช่นนั้น ให้เปลี่ยนชื่อโฟลเดอร์ PkgFolder (หรือ PkgAssets) ในบานหน้าต่าง ตัวสำรวจโซลูชัน และแก้ไขค่าที่ส่งคืนภายใต้คุณสมบัติ GetImportPackageDataFolderName

      public override string GetImportPackageDataFolderName  
      {  
      get  
      {  
      // WARNING this value directly correlates to the folder name in the Solution Explorer where the ImportConfig.xml and sub content is located.  
      // Changing this name requires that you also change the correlating name in the Solution Explorer  
      return "PkgFolder";  
      }  
      }  
      
    8. เปลี่ยนชื่อแพคเกจโดยแก้ไขค่าส่งกลับภายใต้คุณสมบัติ GetNameOfImport

      public override string GetNameOfImport(bool plural)  
      {  
      return "Package Short Name";  
      }  
      

      ค่าที่ส่งคืนนี้เป็นชื่อของแพคเกจของคุณที่ปรากฏบนหน้าการเลือกแพคเกจในตัวช่วยสร้าง Dynamics 365 Package Deployer

    9. เปลี่ยนคำอธิบายแพคเกจโดยแก้ไขค่าส่งกลับภายใต้คุณสมบัติ GetImportPackageDescriptionText

      
      public override string GetImportPackageDescriptionText  
      {  
      get { return "Package Description"; }  
      }  
      
      

      ค่าที่ส่งคืนนี้เป็นคำอธิบายของแพคเกจที่ปรากฏข้างชื่อแพคเกจบนหน้าการเลือกแพคเกจในตัวช่วยสร้าง Package Deployer

    10. เปลี่ยนชื่อเต็มแพคเกจโดยแก้ไขค่าส่งกลับภายใต้คุณสมบัติ GetLongNameOfImport

      
      public override string GetLongNameOfImport  
      {  
      get { return "Package Long Name"; }  
      }  
      
      

      ชื่อเต็มของแพคเกจจะปรากฏในหน้าถัดไป หลังจากคุณเลือกแพคเกจที่จะติดตั้ง

  3. นอกจากนี้ ยังมีฟังก์ชันและตัวแปรต่อไปนี้สำหรับแพคเกจ:

    ชื่อ ชนิด คำอธิบาย
    CreateProgressItem(String) Function ใช้เพื่อสร้างรายการความคืบหน้าใหม่ในส่วนต่อประสานผู้ใช้ (UI)
    RaiseUpdateEvent(String, ProgressPanelItemStatus) Function ใช้เพื่ออัปเดตความคืบหน้าที่สร้างโดยการโทรไป CreateProgressItem(String)

    ProgressPanelItemStatusเป็น enum ที่มีค่าต่อไปนี้:

    กำลังทำงาน = 0
    เสร็จสมบูรณ์ = 1
    ไม่สำเร็จ = 2
    คำเตือน = 3
    ไม่รู้จัก = 4
    RaiseFailEvent(String, Exception) Function ใช้เพื่อยกเลิกการนำเข้าสถานะปัจจุบันด้วยข้อความข้อยกเว้น
    IsRoleAssoicatedWithTeam(Guid, Guid) Function ใช้เพื่อกำหนดว่าบทบาทเชื่อมโยงกับทีมที่ระบุหรือไม่
    IsWorkflowActive(Guid) Function ใช้เพื่อกำหนดว่าเวิร์กโฟลว์ที่ระบุนั้นใช้งานอยู่หรือไม่
    PackageLog ตัวชี้ระดับ ตัวชี้ไปยังส่วนติดต่อการบันทึกที่เตรียมใช้งานแล้วสำหรับแพคเกจ ส่วนติดต่อนี้ถูกใช้โดยแพคเกจ เพื่อบันทึกข้อความและข้อยกเว้นไปยังไฟล์บันทึกแพคเกจ
    RootControlDispatcher คุณสมบัติ ส่วนติดต่อผู้มอบหมายงานที่ใช้เพื่อให้การควบคุมของคุณแสดงผล UI ของตัวเองในระหว่างการปรับใช้แพคเกจ ใช้ส่วนติดต่อนี้เพื่อครอบองค์ประกอบ UI หรือคำสั่งใดๆ คุณจำเป็นต้องตรวจสอบตัวแปรนี้สำหรับค่า Null ก่อนที่จะใช้ เนื่องจากอาจมีการตั้งค่าเป็นค่าหรือไม่ก็ได้
    CrmSvc คุณสมบัติ ตัวชี้ไปยังคลาส CrmServiceClient ที่อนุญาตให้แพคเกจกำหนด Dynamics 365 จากภายในแพคเกจ ใช้ตัวชี้นี้เพื่อดำเนินการวิธีการ SDK และการดำเนินการอื่นๆ ในวิธีการแทนที่
    DataImportBypass คุณสมบัติ ระบุว่า Dynamics 365 Package Deployer ข้ามการดำเนินการนำเข้าข้อมูลทั้งหมดหรือไม่ เช่น การนำเข้า Dataverse ข้อมูลตัวอย่าง ข้อมูลไฟล์คงที่ และข้อมูลที่ส่งออกจากเครื่องมือย้ายการกำหนดค่า ระบุว่าเป็น true หรือ false ค่าเริ่มต้นเป็น false
    OverrideDataImportSafetyChecks คุณสมบัติ ระบุว่า Dynamics 365 Package Deployer ข้ามการตรวจสอบความปลอดภัย ซึ่งจะช่วยในการปรับปรุงประสิทธิภาพการนำเข้าหรือไม่ ระบุว่า true หรือ false ค่าเริ่มต้นเป็น false

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

สร้างและปรับใช้งาน

ส่วนต่อไปนี้อธิบายวิธีการสร้างและปรับใช้แพคเกจ

รุ่น

การสร้างแพคเกจของคุณมีคำอธิบายอยู่ด้านล่างนี้ ขึ้นอยู่กับเครื่องมือที่คุณใช้

หากต้องการสร้างแพคเกจที่สร้างด้วย CLI คุณสามารถโหลดไฟล์ .csproj ลงใน Visual Studio ได้ แต่เราจะใช้คำสั่ง dotnet และ MSBuild แทน ตัวอย่างด้านล่างถือว่าไดเรกทอรีการทำงานมีไฟล์ *.csproj

> dotnet publish

DeploymentPackage -> C:\Users\peter\Downloads\DeploymentPackage\bin\Debug\DeploymentPackage.1.0.0.pdpkg.zip

คุณสามารถเลือกดูรายละเอียดของแพคเกจที่สร้างขึ้นได้

> pac package show --package .\bin\Debug\DeploymentPackage.1.0.0.pdpkg.zip

แพคเกจของคุณประกอบด้วยไฟล์ต่อไปนี้ภายใต้โฟลเดอร์ <Project>\Bin\Debug

  • โฟลเดอร์ <PackageName>: ชื่อโฟลเดอร์เหมือนกับชื่อที่คุณเปลี่ยนสำหรับชื่อโฟลเดอร์แพคเกจในขั้นตอนที่ 2.g ของส่วนนี้ เพิ่มรหัสที่กำหนดเอง โฟลเดอร์นี้ประกอบด้วยโซลูชัน ข้อมูลการกำหนดค่า ไฟล์คงที่ และเนื้อหาทั้งหมดสำหรับแพคเกจของคุณ

หมายเหตุ

คุณอาจเห็นโฟลเดอร์ .NET (เช่น net472) ที่มีโฟลเดอร์ pdpublish ไฟล์ DLL และไฟล์โครงการอื่นๆ จะอยู่ในโฟลเดอร์ pdpublish นั้น

  • <PackageName>.dll: แอสเซมบลีที่ประกอบด้วยรหัสที่กำหนดเองสำหรับแพคเกจของคุณ โดยค่าเริ่มต้น ชื่อของแอสเซมบลีจะเหมือนกับชื่อโครงการของคุณ

ปรับใช้งาน

หลังจากที่คุณสร้างแพคเกจ คุณสามารถปรับใช้งานบนอินสแตนซ์ Dataverse โดยใช้เครื่องมือ Package Deployer, Windows PowerShell หรือคำสั่ง CLI

  • ในการปรับใช้งานโดยใช้เครื่องมือ Package Deployer ก่อนอื่น ให้ดาวน์โหลดเครื่องมือตามที่อธิบายไว้ใน เครื่องมือการพัฒนา Dataverse จากนั้น ปฏิบัติตามข้อมูลโดยละเอียดเกี่ยวกับการปรับใช้งานแพคเกจในบทความ ปรับใช้งานแพคเกจโดยใช้ Package Deployer หรือ Windows PowerShell

  • ในการปรับใช้งานโดยใช้ CLI ให้ใช้คำสั่ง pac package deploy

    > pac package deploy --package .\bin\Debug\DeploymentPackage.1.0.0.pdpkg.zip
    

    หมายเหตุ

    ในการปรับใช้งานแพคเกจกับสภาพแวดล้อมเป้าหมายโดยใช้ CLI คุณต้องตั้งค่าโปรไฟล์การรับรองความถูกต้องก่อนแล้วเลือกองค์กร ข้อมูลเพิ่มเติม: pac auth create, pac org select

แนวทางปฏิบัติ

รายการที่แสดงด้านล่างเป็นเคล็ดลับแนวทางปฏิบัติที่ดีที่สุดบางประการที่ควรปฏิบัติตามเมื่อทำงานกับแพค Package Deployer

การสร้างแพคเกจ

เมื่อสร้างแพคเกจ นักพัฒนาต้อง:

  • ตรวจสอบให้แน่ใจว่าแพคเกจแอสเซมบลีได้รับการรับรอง

การปรับใช้งานแพคเกจ

เมื่อปรับใช้งานแพคเกจ ผู้ดูแลระบบ Dataverse ต้อง:

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

ดูเพิ่มเติม

เครื่องมือ Solution Packager