Offline-Version von Makecode für ca. 30 Schüler

Hallo,

aufgrund verschiedener Umstände haben wir seit/für mehrere Monate kein Internet an den PCs in den Computerräumen der Schule.

Gibt es Erfahrungen zur Nutzung der Offline-Version?
Wie viel Power sollte eine Server haben, um eine Klasse bedienen zu können? Reicht vielleicht für den Übergang sogar ein Raspi?

Viele Grüße, Thomas Karp

Dadurch, dass nach einem ersten Laden alles im Cache funktioniert (sofern nicht neue Erweiterungen geladen werden), benötigst du nicht viel Power. Allerdings ist die Toolchain nicht ganz einfach zu installieren: GitHub - microsoft/pxt-calliope: A Microsoft MakeCode editor for the Calliope Mini board

Die Installation an sich - also wie auf der Seite unter „Local Server Setup“ beschrieben - war eine Sache von zwei Minuten, zumindest bei mir auf dem Mac mit schon installiertem Nodejs und git.

Die lokale Makecode Seite kann auch geladen werden und in der Simulation scheint es zu funktionieren. Zum Laden auf den Calliope muss man aber anscheinend beim ersten mal online sein. Den Server könnte ich auch mit dem Internet verbinden, nur die Clients nicht. Würde das reichen?

Oder muss ich, um komplett lokal zu arbeiten, die Schritte unter „Developer Setup“ ausführen?

Vielleicht hat ja jemand ein Raspi-Image oder einen Docker-Container?

Ich nutze dieses Dockerfile mit lokalem Build (bzw. etwas angepasst zu zusammen mit podman-compose, aber das Dockerfile habe ich gerade auch so getestet):

FROM node:18-bullseye

# Install system dependencies needed for PXT builds
RUN apt-get update && apt-get install -y \
    git \
    python3 \
    python3-pip \
    build-essential \
    cmake \
    mercurial \
    ninja-build \
    gcc-arm-none-eabi \
    gdb-arm-none-eabi \
    openocd \
    wget \
    curl \
    vim \
    less \
    tree \
    srecord \
    && rm -rf /var/lib/apt/lists/*


# Ensure 'python' points to 'python3' for legacy scripts
RUN ln -s /usr/bin/python3 /usr/bin/python

RUN pip3 install "markupsafe<2.1" "jinja2<3.1"
RUN pip3 install --prefer-binary --no-cache-dir yotta

# Set working directory
WORKDIR /workspace

# Install PXT CLI and common packages globally
RUN npm install -g pxt


# Option A) Mount directories and build in Startup script
# RUN mkdir -p /workspace/pxt-calliope \
#              /workspace/pxt \
#              /workspace/pxt-common-packages \
#              /workspace/temp

# Option B) Clone the PXT Calliope repositorys and install dependencies

# local pxt: clone PXT repository (optional)
# Make sure to choose the desired branch or commit if needed
# RUN git clone https://github.com/microsoft/pxt.git /workspace/pxt
# RUN cd /workspace/pxt && \
#     npm install
#     npm run build

RUN git clone https://github.com/microsoft/pxt-calliope.git /workspace/pxt-calliope
RUN cd /workspace/pxt-calliope && \
    npm install

# local pxt: link the cloned PXT repository
# RUN npm link ../pxt


ARG GITHUB_AUTHTOKEN
ENV GITHUB_AUTHTOKEN=${GITHUB_AUTHTOKEN}
ENV YOTTA_GITHUB_AUTHTOKEN=${GITHUB_AUTHTOKEN}

# Set environment variables for local builds
ENV PXT_FORCE_LOCAL=1
ENV PXT_NODOCKER=1
ENV PXT_DEBUG=1
ENV PATH="/workspace/node_modules/.bin:$PATH"

# Create a startup script
RUN echo '#!/bin/bash\n\
echo "=== PXT CLI Docker Environment ==="\n\
echo "Available commands:"\n\
echo "  pxt builddaldts --clean # Build dal.d.ts"\n\
echo "  pxt build               # Build project"\n\
echo "  pxt serve               # Start dev server, e.g. pxt serve --hostname 0.0.0.0 --noBrowser"\n\
echo "  npm install             # Install dependencies"\n\
echo "  pxt clean               # Clean build artifacts"\n\
echo ""\n\
echo "Environment variables set:"\n\
echo "  PXT_FORCE_LOCAL=1 (force local builds)"\n\
echo "  PXT_NODOCKER=1    (disable Docker)"\n\
echo "  PXT_DEBUG=1       (enable debug output)"\n\
echo ""\n\
echo "Available directories:"\n\
ls -la /workspace/\n\
echo ""\n\
cd /workspace/pxt-calliope || echo "pxt-calliope directory not mounted"\n\
echo "Current directory: $(pwd)"\n\
exec "$@"' > /entrypoint.sh && chmod +x /entrypoint.sh

# Set git config to avoid permission issues
RUN git config --global --add safe.directory '*'
RUN git config --global user.email "dev@example.com"
RUN git config --global user.name "PXT Developer"



ENTRYPOINT ["/entrypoint.sh"]
CMD ["/bin/bash"]

Für die Nutzung der Microsfot Cloud für den Buildprozess könnte man das Dockerfile etwas entschlacken.

Build

$: podman build --build-arg GITHUB_AUTHTOKEN=YOUR_TOKEN -t pxt-calliope .

Der erste Build klappt eventuell noch ohne Auth Token, aber man kommt recht schnell ins Limit und braucht dann ein Token (ohne weitere rechte, einfach public read): https://github.com/settings/tokens

Starten

podman run --rm -it -p 3232:3232 -p 3233:3233 pxt-calliope pxt serve --hostname 0.0.0.0 --noBrowser

Und dann den Link nicht mit 0.0.0.0, sondern mit Localhost öffnen: http://localhost:3232/index.html#

Der Befehl pxt serve startet zwar einen Server, aber der ist eigentlich nur für den Lokalen zugriff gedacht und blockt zugriffe, die nicht localhost als Host haben.

In pxt-core kann man die sperre zwar umgehen ( vgl. enable acces from local network · microsoft/pxt@20cae97 · GitHub ), das muss dann aber jeweils für die in pxt-calliope in der packages.json definierten Version angepasst werden. Außerdem ist das eben nicht für den produktiven Einsatz gedacht, also maximal für den Lokalen Test im eigenen Netzwerk.
Sobald man versucht den Server mit SSL abzusichern, stürzt er dann (zumindest bei meinen Versuchen) auch bei den ersten Aufrufen sehr schnell ab.

Die Alternative zu pxt serve ist der Befehl pxt staticpkg, damit bekommt man einen statischen Build, den man mit jedem HTTP/S Server einfach ausspielen kann. Nachteil ist nur, dass es Einschränkungen bei dem Laden von Erweiterungen gibt (ohne Internetzugriff ja sowieso) und der Server eben nicht neu builden kann, wenn das nötig ist.
Umgehen lässt sich das, wenn man Hex-Dateien mit benötigten Erweiterungen & Builds vorhält, die man vorher an einem vollwertigen MakeCode erstellt hat.

Es bleibt eine Bastellösung, aber vielleicht hilft es dir ja schon weiter (falls du nicht schon selbst so weit gekommen bist mittlerweile).

Vielen Dank für die ausführliche Antwort!

Ich habe es auf die Schnelle mit pxt staticpkg probiert und im Prinzip klappt das wohl auch.
Die Übertragung auf den Calliope über WebUSB hat nicht funktioniert, aber der Calliope wurde mir am Macbook auch gar nicht als USB-Gerät angezeigt. Irgendetwas hat da also schon unabhängig von Makecode nicht funktioniert bei mir.

Angeblich sollen wir zwei Wochen nach Schulbeginn endlich wieder Internet haben. Ich mache deshalb erst etwas anderes im Unterricht und hoffe, dass wir dann wirklich bald wieder online sind. Ansonsten würde ich noch mal genauer testen.