การจัดการแพ็กเกจ

การติดตั้งแพ็กเกจด้วย mip

บอร์ดที่รองรับเครือข่ายมีโมดูล mip ซึ่งสามารถติดตั้งแพ็กเกจจาก micropython-lib และจากไซต์บุคคลที่สาม (รวมถึง GitHub, GitLab)

mip ("mip installs packages") มีแนวคิดคล้ายกับเครื่องมือ pip ของ Python แต่ไม่ใช้ดัชนี PyPI แต่ใช้ micropython-lib เป็นดัชนีเริ่มต้นแทน mip จะดาวน์โหลด .mpy file ที่คอมไพล์แล้วโดยอัตโนมัติเมื่อดาวน์โหลดจาก micropython-lib

วิธีที่พบบ่อยที่สุดในการใช้ mip คือจาก REPL:

>>> import mip
>>> mip.install("pkgname")  # Installs the latest version of "pkgname" (and dependencies)
>>> mip.install("pkgname", version="x.y")  # Installs version x.y of "pkgname"
>>> mip.install("pkgname", mpy=False)  # Installs the source version (i.e. .py rather than .mpy files)

mip จะตรวจหาตำแหน่งที่เหมาะสมบนระบบไฟล์โดยค้นหา sys.path สำหรับรายการแรกที่ลงท้ายด้วย /lib คุณสามารถแทนที่ปลายทางโดยใช้ target แต่โปรดทราบว่าเส้นทางนี้ต้องอยู่ใน sys.path เพื่อให้สามารถนำเข้าได้ในภายหลัง:

>>> mip.install("pkgname", target="third-party")
>>> sys.path.append("third-party")

นอกจากการดาวน์โหลดแพ็กเกจจากดัชนี micropython-lib แล้ว mip ยังสามารถติดตั้งไลบรารีบุคคลที่สามได้อีกด้วย วิธีที่ง่ายที่สุดคือดาวน์โหลดไฟล์โดยตรง:

>>> mip.install("http://example.com/x/y/foo.py")
>>> mip.install("http://example.com/x/y/foo.mpy")

เมื่อติดตั้งไฟล์โดยตรง อาร์กิวเมนต์ target ยังรองรับเพื่อตั้งค่าเส้นทางปลายทาง แต่ mpy และ version จะถูกละเว้น

URL ยังสามารถเริ่มต้นด้วย github: หรือ gitlab: เป็นวิธีง่าย ๆ ในการชี้ไปที่เนื้อหาที่โฮสต์บน GitHub หรือ GitLab:

>>> mip.install("github:org/repo/path/foo.py")  # Uses default branch
>>> mip.install("github:org/repo/path/foo.py", version="branch-or-tag")  # Optionally specify the branch or tag
>>> mip.install("gitlab:org/repo/path/foo.py")  # Uses default branch
>>> mip.install("gitlab:org/repo/path/foo.py", version="branch-or-tag")  # Optionally specify the branch or tag

แพ็กเกจที่ซับซ้อนมากขึ้น (เช่น มีมากกว่าหนึ่งไฟล์ หรือมีการพึ่งพา) สามารถดาวน์โหลดได้โดยระบุเส้นทางไปยัง package.json ของมัน:

>>> mip.install("http://example.com/x/package.json")
>>> mip.install("github:org/user/path/package.json")
>>> mip.install("gitlab:org/user/path/package.json")

หากไม่ได้ระบุไฟล์ json จะเพิ่ม "package.json" โดยนัย:

>>> mip.install("http://example.com/x/")
>>> mip.install("github:org/repo")  # Uses default branch of that repo
>>> mip.install("github:org/repo", version="branch-or-tag")
>>> mip.install("gitlab:org/repo")  # Uses default branch of that repo
>>> mip.install("gitlab:org/repo", version="branch-or-tag")

การใช้ mip บน Unix port

บน Unix port mip สามารถใช้ที่ REPL ได้ตามด้านบน และยังสามารถใช้ -m ได้อีกด้วย:

$ ./micropython -m mip install pkgname-or-url
$ ./micropython -m mip install pkgname-or-url@version

อาร์กิวเมนต์ --target path, --no-mpy และ --index สามารถตั้งค่าได้:

$ ./micropython -m mip install --target third-party pkgname
$ ./micropython -m mip install --no-mpy pkgname
$ ./micropython -m mip install --index https://host/pi pkgname

การติดตั้งแพ็กเกจด้วย mpremote

เครื่องมือ mpremote ยังรวมฟังก์ชันการทำงานเดียวกันกับ mip และสามารถใช้จากพีซีโฮสต์เพื่อติดตั้งแพ็กเกจไปยังอุปกรณ์ที่เชื่อมต่อในเครื่อง (เช่น ผ่าน USB หรือ UART):

$ mpremote mip install pkgname
$ mpremote mip install [email protected]
$ mpremote mip install http://example.com/x/y/foo.py
$ mpremote mip install github:org/repo
$ mpremote mip install github:org/repo@branch-or-tag
$ mpremote mip install gitlab:org/repo
$ mpremote mip install gitlab:org/repo@branch-or-tag

อาร์กิวเมนต์ --target=path, --no-mpy และ --index สามารถตั้งค่าได้:

$ mpremote mip install --target=/flash/third-party pkgname
$ mpremote mip install --no-mpy pkgname
$ mpremote mip install --index https://host/pi pkgname

mpremote ยังสามารถติดตั้งแพ็กเกจจากไฟล์ที่เก็บอยู่บนระบบไฟล์ในเครื่องของโฮสต์ได้:

$ mpremote mip install path/to/pkg.py
$ mpremote mip install path/to/app/package.json
$ mpremote mip install \\path\\to\\pkg.py

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการทดสอบแพ็กเกจระหว่างการพัฒนาและสำหรับการติดตั้งแพ็กเกจจาก clone ในเครื่องของที่เก็บ GitHub โปรดทราบว่า URL ในไฟล์ package.json ต้องใช้เครื่องหมายทับไปข้างหน้า ("/") เป็นตัวคั่นไดเรกทอรี แม้แต่บน Windows เพื่อให้เข้ากันได้กับการติดตั้งจากเว็บ

การติดตั้งแพ็กเกจด้วยตนเอง

แพ็กเกจยังสามารถติดตั้ง (ในรูปแบบ .py หรือ .mpy) โดยการคัดลอกไฟล์ไปยังอุปกรณ์ด้วยตนเอง ขึ้นอยู่กับบอร์ด อาจผ่าน USB Mass Storage เครื่องมือ mpremote (เช่น mpremote fs cp path/to/package.py :package.py), webrepl เป็นต้น

การเขียนและเผยแพร่แพ็กเกจ

การเผยแพร่ไปยัง micropython-lib เป็นวิธีที่ง่ายที่สุดในการทำให้แพ็กเกจของคุณเข้าถึงได้อย่างกว้างขวางสำหรับผู้ใช้ MicroPython และสามารถใช้งานได้อัตโนมัติผ่าน mip และ mpremote และคอมไพล์เป็น bytecode ดูข้อมูลเพิ่มเติมที่ https://github.com/micropython/micropython-lib

ในการเขียนแพ็กเกจ "self-hosted" ที่สามารถดาวน์โหลดได้โดย mip หรือ mpremote คุณต้องการเว็บเซิร์ฟเวอร์แบบสถิต (หรือ GitHub) เพื่อโฮสต์ไฟล์ .py เดี่ยว หรือไฟล์ package.json ควบคู่กับไฟล์ .py ของคุณ

ตัวอย่างไลบรารี mlx90640 ที่โฮสต์บน GitHub สามารถติดตั้งได้ด้วย:

$ mpremote mip install github:org/micropython-mlx90640

เลย์เอาต์สำหรับแพ็กเกจบน GitHub อาจมีลักษณะดังนี้:

https://github.com/org/micropython-mlx90640/
    package.json
    mlx90640/
        __init__.py
        utils.py

package.json ระบุตำแหน่งของไฟล์ที่จะติดตั้งและการพึ่งพาอื่น ๆ:

{
  "urls": [
    ["mlx90640/__init__.py", "mlx90640/__init__.py"],
    ["mlx90640/utils.py", "mlx90640/utils.py"]
  ],
  "deps": [
    ["collections-defaultdict", "latest"],
    ["os-path", "latest"],
    ["github:org/micropython-additions", "main"],
    ["gitlab:org/micropython-otheradditions", "main"]
  ],
  "version": "0.2"
}

รายการ urls ระบุไฟล์ที่จะติดตั้งตาม:

"urls": [
    [destination_path, source_url]
    ...

โดยที่ destination_path คือตำแหน่งและชื่อของไฟล์ที่จะติดตั้งบนอุปกรณ์ และ source_url คือ URL ของไฟล์ที่จะติดตั้ง URL ต้นฉบับมักจะระบุแบบสัมพัทธ์กับไดเรกทอรีที่มีไฟล์ package.json แต่ยังสามารถเป็น URL แบบสมบูรณ์ได้ เช่น:

["mlx90640/utils.py", "github:org/micropython-mlx90640/mlx90640/utils.py"]

แพ็กเกจขึ้นอยู่กับ collections-defaultdict และ os-path ซึ่งจะถูกติดตั้งโดยอัตโนมัติจาก micropython-lib การพึ่งพาที่สามติดตั้งเนื้อหาตามที่กำหนดโดยไฟล์ package.json ของสาขา main ของที่เก็บ GitHub org/micropython-additions

การ freeze แพ็กเกจ

เมื่อโมดูลหรือแพ็กเกจ Python ถูกนำเข้าจากระบบไฟล์ของอุปกรณ์ มันจะถูกคอมไพล์เป็น bytecode ใน RAM พร้อมสำหรับการรันโดย VM สำหรับ .mpy file การแปลงนี้ได้ทำไปแล้ว แต่ bytecode ยังคงอยู่ใน RAM

สำหรับอุปกรณ์ที่มีหน่วยความจำน้อย หรือสำหรับแอปพลิเคชันขนาดใหญ่ อาจเป็นประโยชน์ที่จะรัน bytecode จาก ROM (เช่น หน่วยความจำแฟลช) แทน สิ่งนี้ทำได้โดยการ "freeze" bytecode เข้าไปในเฟิร์มแวร์ MicroPython ซึ่งจากนั้นจะถูกแฟลชไปยังอุปกรณ์ ประสิทธิภาพรันไทม์เหมือนกัน (แม้ว่าการนำเข้าจะเร็วกว่า) แต่สามารถเพิ่ม RAM ที่ว่างอย่างมีนัยสำคัญสำหรับโปรแกรมของคุณ

ข้อเสียของแนวทางนี้คือใช้เวลาพัฒนานานขึ้นมาก เนื่องจากต้องแฟลชเฟิร์มแวร์ทุกครั้ง แต่ยังคงมีประโยชน์ในการ freeze การพึ่งพาที่ไม่เปลี่ยนบ่อย

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