การคอมไพล์จากซอร์สโค้ด
หน้านี้จะอธิบายวิธีคอมไพล์และรัน Antimatter จากซอร์สโค้ด เพื่อใช้ในการพัฒนาหรือสร้างเวอร์ชันของคุณเอง ครอบคลุมทั้งเซิร์ฟเวอร์และอินเทอร์เฟซเว็บ ซึ่งอยู่ในรีพอสิทอรีเดียวกัน จากนั้นจึงเป็น Docker image และแอปพลิเคชัน
สิ่งที่คุณต้องมี
- ไป ในเวอร์ชันท่ีระบุนใน
server/go.mod(1.26.7 ณ เวลาท่ีเขียน) - Node.js และ npm ในเวอร์ชันที่ระบุใน
.nvmrcและwebapp/package.json(Node 24.11.1 พร้อม npm 11.6.2) หากใช้ mise ไฟล์mise.tomlในรีพอสิทอรีจะติดตั้ง Node เวอร์ชันที่ถูกต้องให้อัตโนมัติ - Docker พร้อม Compose: การตั้งค่าสำหรับพัฒนาจะรัน PostgreSQL และบริการอื่นๆ อีกเล็กน้อยในคอนเทนเนอร์
- make, git และเครื่องคอมพิวเตอร์ที่รันระบบปฏิบัติการ Linux หรือ macOS
- หน่วยความจำ: การคอมไพล์อินเทอร์เฟซเว็บเป็นขั้นตอนที่ใช้ทรัพยากรมาก ควรเตรียม RAM ไว้ที่ 16 GB ดูข้อมูลเพิ่มเติมได้ที่ การคอมไพล์และหน่วยความจำ
git clone https://github.com/AntimatterChat/antimatter.git
cd antimatter
รีพอสิทอรีเก็บเซิร์ฟเวอร์ไว้ใน server/, อินเทอร์เฟซเว็บไว้ใน webapp/ (Fusion อยู่ใน webapp/fusion, แบบคลาสสิกอยู่ใน webapp/channels, แพ็กเกจที่ใช้ร่วมกันอยู่ใน webapp/platform) และการทดสอบ end-to-end อยู่ใน e2e-tests/
การรันเซิร์ฟเวอร์สำหรับพัฒนา
cd server
make run
make run จะเริ่มคอนเทนเนอร์สำหรับพัฒนา (PostgreSQL, Redis, เครื่องดักอีเมล และเครื่องมือตรวจสอบ), เชื่อมต่อไฟล์ที่คอมไพล์แล้วของเว็บแอปเข้าที่, รันเซิร์ฟเวอร์ในพื้นหลังด้วย go run, และเริ่มตัวเฝ้าดู (watcher) ของเว็บแอป ซึ่งจะคอมไพล์อินเทอร์เฟซแบบคลาสสิกใหม่ทุกครั้งที่คุณแก้ไขโค้ด เปิด http://localhost:8065 และสร้างบัญชี: บัญชีแรกจะเป็นผู้ดูลำดับ (system admin)
คำสั่ง (ใน server/) | สิ่งที่ทำ |
|---|---|
make run-server, make run-client | รันเฉพาะเซิร์ฟเวอร์ หรือเฉพาะตัวเฝ้าดูของเว็บแอป |
make restart-server | รีสตาร์ทเซิร์ฟเวอร์หลังจากแก้ไขโค้ด Go |
make stop | หยุดเซิร์ฟเวอร์ ตัวเฝ้าดู และคอนเทนเนอร์ |
make debug-server | รันเซิร์ฟเวอร์ภายใต้ Delve debugger |
make run-cli ARGS="-version" | รันคำสั่งของเซิร์ฟเวอร์ |
make config-reset | รีเซ็ต config/config.json กลับเป็นค่าเริ่มต้น |
make clean, make nuke | ลบไฟล์ที่คอมไพล์แล้ว; คำสั่ง nuke จะลบข้อมูลสำหรับพัฒนาด้วย |
ฐานข้อมูลสำหรับพัฒนาคือ postgres://mmuser:mostest_password@localhost/mattermost_test ซึ่งเป็นแหล่งข้อมูลเริ่มต้นของเซิร์ฟเวอร์ คุณสามารถเลือกคอนเทนเนอร์ที่จะเริ่มทำงานได้ผ่าน ENABLED_DOCKER_SERVICES ในไฟล์ server/config.override.mk หรือในตัวแปรสภาพแวดล้อม (ดู server/config.mk สำหรับรายละเอียด)
อินเทอร์เฟซเว็บ
ใน webapp/:
npm install # also builds the shared packages
npm run build # the classic interface, then Fusion
ไฟล์ที่สร้างเสร็จจะอยู่ที่ webapp/channels/dist (classic) และ webapp/fusion/dist (Fusion) การรัน make client ใน server/ จะเชื่อมโยงไฟล์เหล่านี้เป็น server/client และ server/client-fusion ซึ่งเซิร์ฟเวอร์จะให้บริการไฟล์เหล่านี้โดย classic จะอยู่ภายใต้ /static/ และ Fusion จะอยู่ภายใต้ /static/fusion/
npm run run(หรือmake runในwebapp/) จะเฝ้าดูและสร้างอินเทอร์เฟซ classic ใหม่ เพิ่มWATCH_FUSION=trueเพื่อสร้าง Fusion ใหม่ด้วยnpm run dev-server(make dev) จะรันเซิร์ฟเวอร์พัฒนาของ webpack แทน: classic บนพอร์ต 9005 และ Fusion บนพอร์ต 9006- เพื่อดูอินเทอร์เฟซแบบใดแบบหนึ่งในเบราว์เซอร์ ให้เพิ่ม
?webui=fusionหรือ?webui=classicต่อท้ายที่อยู่ของหน้าเว็บ
การทดสอบและการตรวจสอบ
| คำสั่ง | ตำแหน่ง | สิ่งที่ทำ |
|---|---|---|
make test-server | server/ | ชุดการทดสอบของเซิร์ฟเวอร์ โดยทดสอบกับคอนเทนเนอร์สำหรับพัฒนา ซึ่งใช้เวลาค่อนข้างนาน |
make test-server-quick | server/ | เฉพาะการทดสอบแบบสั้น |
go test ./channels/app/... -run TestName | server/ | แพ็กเกจหรือการทดสอบหนึ่งรายการ โดยรันขณะที่คอนเทนเนอร์ทำงานอยู่ (make start-docker) |
make check-style | server/ | go vet, golangci-lint และการตรวจสอบ Go อื่นๆ |
make test | webapp/ | การทดสอบหน่วย (Jest) ของเว็บแอป ในทุกแพ็กเกจ |
npm run test -- <pattern> | webapp/fusion | การทดสอบบางส่วนของ Fusion |
make check-style, make check-types | webapp/ | ESLint และ TypeScript |
make i18n-extract | server/ และ webapp/ | อัปเดตไฟล์สตริงภาษาอังกฤษหลังจากที่คุณเพิ่มหรือแก้ไขสตริง (ดู การแปล) |
ให้รัน make modules-tidy แทน go mod tidy ใน server/
ไฟล์อาร์ไคฟ์สำหรับเผยแพร่
cd webapp && npm run build && cd ..
cd server
make build-linux # the antimatter and amctl binaries
make package-linux # dist/antimatter-linux-amd64.tar.gz and -arm64
make build สร้างอินเทอร์เฟซเว็บและไบนารีสำหรับ Linux ในครั้งเดียว อาร์ไคฟ์ประกอบด้วย bin/antimatter, bin/amctl, config/config.json ค่าเริ่มต้นพร้อม README.md อธิบายวิธีเปลี่ยนการตั้งค่า, อินเทอร์เฟซเว็บทั้งสอง, เทมเพลต, ฟอนต์ และการแปลภาษา สำหรับแพลตฟอร์มอื่น: make package-osx, make package-windows, make package-freebsd.
แอปที่รวมมาให้
การรัน make package-linux ธรรมดาจะสร้างอาร์ไคฟ์โดยไม่มีแอป หากต้องการรวมแอปไว้ด้วย เช่นเดียวกับที่การปล่อยเวอร์ชันอย่างเป็นทางการทำ ให้ดาวน์โหลดแอปที่ลงนามแล้วก่อน แล้วระบุโฟลเดอร์ของแอปเหล่านั้น:
build/package/fetch-apps.sh "$HOME/release-apps" # needs gh, python3 and gpg
make package-linux PREPACKAGED_PLUGINS_DIR="$HOME/release-apps"
fetch-apps.sh ดาวน์โหลดการปล่อยเวอร์ชันล่าสุดบน GitHub ของแต่ละแอปที่ระบุใน plugins.json ของ antimatter-docker พร้อมลายเซ็น และตรวจสอบลายเซ็นกับคีย์ปลั๊กอินของ Antimatter โดยค่าเริ่มต้นจะดึง Whiteboard, Voice channels, Calls, Agents, Todo, Polls, Notes, GIFs และ Memes; AM_BUNDLED_APPS (ชื่อรีพอสิทอรี คั่นด้วยช่องว่าง) ใช้สำหรับเปลี่ยนรายการ แอปที่ไม่มีเวอร์ชันปล่อย หรือไม่มีลายเซ็น จะถูกข้ามพร้อมคำเตือน แอปเหล่านี้จะถูกเก็บใน prepackaged_plugins/ ของอาร์ไคฟ์
แพ็กเกจ .deb และ .rpm
build/package/build-packages.sh <archive> <amd64|arm64> <version> <out-dir> เปลี่ยนอาร์ไคฟ์สำหรับปล่อยเวอร์ชันเป็นแพ็กเกจ .deb และ .rpm แบบ all-in-one โดยใช้ nfpm คู่มือสำหรับผู้ดูแลระบบอธิบายสิ่งที่แพ็กเกจเหล่านี้ติดตั้ง: ดู ติดตั้งแพ็กเกจ .deb หรือ .rpm
เวิร์กโฟลว์สำหรับปล่อยเวอร์ชัน
เวิร์กโฟลว์ antimatter-release.yml ในรีพอสิทอรีเซิร์ฟเวอร์จะทำทุกอย่างนี้บน GitHub: เมื่อมีแท็ก v* จะสร้างอาร์ไคฟ์และแพ็กเกจสำหรับ amd64 และ arm64 พร้อม SHA256SUMS และเผยแพร่เป็น GitHub release ของแท็กนั้น (เป็น prerelease สำหรับเวอร์ชันที่มี -) หากรันด้วยมือ จะกำหนดหมายเลข build เป็น 0.9.0-dev.<run> และเก็บไฟล์ไว้เป็น workflow artifacts แต่ละรีพอสิทอรีของแอปมีเวิร์กโฟลว์ release.yml ที่เผยแพร่แอปที่ลงนามแล้วในลักษณะเดียวกัน
Docker image
รีพอสิทอรี antimatter-docker สร้าง image ที่เผยแพร่ ซึ่งประกอบด้วยเซิร์ฟเวอร์และแอปทั้งหมดภายใน Docker:
git clone https://github.com/AntimatterChat/antimatter-docker.git
cd antimatter-docker
scripts/build-all.sh # from the main branches on GitHub
SOURCES=local scripts/build-all.sh # from your checkouts next to this folder
VARIANT=next scripts/build-all.sh # the "next" image, with every Antimatter app
ต้องใช้ Docker ที่รองรับ buildx, Python 3, git และ gpg พร้อม RAM ประมาณ 16 GB และพื้นที่ดิสก์ 30 GB ผลลัพธ์จะถูกโหลดเป็น ghcr.io/antimatterchat/antimatter:dev; ลองใช้ด้วย ANTIMATTER_IMAGE=ghcr.io/antimatterchat/antimatter:dev docker compose -f compose.local.yml up -d plugins.json จะระบุรายการแอปและเวอร์ชันที่สร้าง และ README ของรีพอสิทอรีจะอธิบายถึงตัวแปรต่างๆ
build-all.sh ทำลายลายเซ็นแอปที่รวมอยู่ในแพ็กเกจด้วยคีย์ลายเซ็นของ Antimatter และกระบวนการสร้างภาพ (image build) จะปฏิเสธแอปที่ไม่มีลายเซ็น หากไม่มีคีย์ส่วนตัว (private key) ซึ่งเฉพาะผู้ดูแลระบบ (maintainers) เท่านั้นที่มี ให้รันขั้นตอนแรกๆ แยกกัน: scripts/fetch-sources.sh, scripts/build-plugins.sh (แอปใน out/plugins/) และ scripts/build-server.sh (ไฟล์เซิร์ฟเวอร์ใน out/server/)การสร้างและหน่วยความจำ
อินเทอร์เฟซเว็บเป็นการสร้าง (build) ด้วย webpack ขนาดใหญ่ และการหมดหน่วยความจำ (out of memory) เป็นสาเหตุที่พบบ่อยที่สุดของการสร้างล้มเหลว
npm run buildสร้างอินเทอร์เฟซแบบคลาสสิกและ Fusion ไล่ตามลำดับทีละตัว ไม่ใช่พร้อมกัน เพื่อลดจุดสูงสุด (peak) ของการใช้หน่วยความจำ อย่ารันทั้งสองอย่างพร้อมกันด้วยตนเอง- ตัวลดขนาด (minifier) จะเริ่ม worker หนึ่งตัวต่อโปรเซสเซอร์ หากเครื่องมีหลายคอร์แต่หน่วยความจำน้อย ให้จำกัดจำนวนโปรเซสเซอร์ที่การสร้างมองเห็น:
taskset -c 0-5 npm run build - หาก Node หมดพื้นที่ heap ให้เพิ่มขีดจำกัด:
NODE_OPTIONS=--max-old-space-size=6144การสร้าง Docker ใช้ค่านี้ (BUILD_NODE_OPTIONSในbuild.env) - หลีกเลี่ยงการรันชุดทดสอบ (test suite) ทั้งหมดของเซิร์ฟเวอร์ การสร้างเว็บ และการสร้าง Docker พร้อมกันบนเครื่องขนาดเล็ก
แอปพลิเคชัน
แต่ละแอป (plugin) มีรีพอสิทอรี (repository) และ Makefile ของตัวเอง; make dist สร้าง bundle ของแอปนั้น ดู การสร้าง การติดตั้ง และการดีบัก
แอปเดสก์ท็อป
แอปเดสก์ท็อป เป็นแอป Electron โดยใช้ Node.js 24 หรือสูงกว่า:
npm install --allow-git=all
npm run build # development build, into dist/
npm start # run it
npm run package:linux # packages into release/ (also package:windows, package:mac)
การตั้งค่าตอนสร้างแอป เช่น เซิร์ฟเวอร์ที่จะตั้งค่าไว้ล่วงหน้า อยู่ใน src/common/config/buildConfig.ts หากไม่มีใบรับรองจาก Apple ให้ตั้ง AM_MAC_ADHOC_SIGN=true เพื่อเซ็นแอป macOS แบบ ad hoc โดยไม่ผ่านกระบวนการ notarisation: Mac ที่ใช้ Apple silicon จะไม่รันโค้ดที่ไม่ได้เซ็นชื่อ Workflow release.yml ในรีพอสิทอรีจะสร้างแพ็กเกจที่ไม่ได้เซ็นชื่อสำหรับ Linux, Windows และ macOS เมื่อมีแท็ก v*
แอปมือถือ
แอปมือถือ เป็นแอป React Native; README ของแอปมีรายการคำสั่ง (npm run ios, npm run android) เพื่อสร้างแอปของคุณเอง คุณยังต้องการคีย์เซ็นชื่อของคุณเอง, โปรเจกต์ Firebase สำหรับการแจ้งเตือนบน Android, กุญแจ APNs สำหรับ iOS และ push proxy ที่เก็บข้อมูลรับรองเหล่านั้น Workflow release.yml ในรีพอสิทอรีจะสร้าง Android APK และ AAB และ iOS .ipa ที่ไม่ได้เซ็นชื่อเมื่อมีแท็ก v* โดยไม่ต้องมีบัญชีสโตร์; README ของ workflow มีรายการ secret ที่ใช้เซ็นการสร้าง Android และตั้งค่า Firebase