# How To Build QPKG ## 簡介 ### QPKG * QPKG 是 qnap 提供, 專門放在 qnap 環境使用的檔案格式. 可以把其他軟體包裝成 QPKG 格式, 供其他 user 在 qnap 上使用 * QPKG 是以 shell script 為基礎進行包裝, 以一份 shell script 檔提供 `start`, `stop` 等指令 * 可在 QNap NAS 上, 或其他 Linux 環境安裝 QPKG 開發工具進行開發 ### QNap QTS * QNap 上搭載的 GUI 管理介面 * 可以網頁形式開啟 (host_ip:8080) * 上面有 APP Center 可以 * 可以搜尋 App 並安裝, 管理 * 所有安裝好的 QPKG 會出現在 APP Center 上 * 上面有 Container Station, 是 docker 的 GUI 介面 * 可以使用 docker * 包含一般的 container / image 控制 * 可以搜尋 docker hub * 支援 docker-compose * container-station > create 分頁 > create application 按鈕可出現視窗, 讓你輸入 docker-compose.yml 的內容 ### QDK * QDK 全名 QNAP Development Kit. * 是用來開發 QPKG 的工具 * QDK 也被包裝成一個 QPKG 以供使用 ## 建立環境 ### 建立 QDK 環境 ( on QNap NAS ) * 安裝 QDK * QDK 是 QNap 官方提供用來建立 QNap Nas 專用 App 的工具 * 在 QTS 介面中的 App Center 搜尋 `QDK` 並安裝 * 有提供 command line 安裝方式, 一般 linux 也可以安裝來開發 * 環境 * 指令 ```cd `getcfg QDK Install_Path -f /etc/config/qpkg.conf` ``` 切換到 qnap 的安裝路徑, 其中 * `bin/qbuild` 這個檔案應該是 qbuild 指令的本體 * `template` folder 中放置新 qpkg 開發環境的 template file * 其他 * QDK 沒有提供 GUI 開發介面, 以 command line 介面下指令進行相關的包裝行為 * `getcfg` * 用來取得 某檔案 -> 某個設定集合 -> 某個設定值 * 指令格式 : * `getcfg [config_group] [key_1] [key_2] ... -f [config_path]` * `getcfg [ QDK ] [Install_Path] -f [/etc/config/qpkg.conf]` * 可以開 `/etc/config/qpkg.conf` 這份檔案 看對應的檔案格式 ### 建立 QPKG 專案 * `qbuild --create-env` 指令 * 用來建立一個新的 QPKG App 專案 * 需在 QPKG 安裝路徑下使用 * 指令 `qbuild --create-env MyQPKG`, 其中 `MyQPKG` 替換成你的 Project Name * 此時會有一個新的 MyQPKG folder 出現 ( 跟原本的 folder 和在一起 ) * 所有建立新的 QPKG 開發環境指令如下 * ```cd `getcfg QDK Install_Path -f /etc/config/qpkg.conf` ``` * `qbuild --create-env KdanQPKG` * `cd KdanQPKG` * 將路徑切到 QPKG 專案中 ( 如上述的 KdanQPKG folder ) 可看到 * `qpkg.cfg` file * 主要的 config 檔, 包含多種設定 * `package_routines` file * 程式 install 時的一些 callback function * `icons/` folder * 程式 icon, 若 QPKG_NAME Name 為 KdanQPKG, 則需含有 * `KdanQPKG.gif` : App 列表顯示的 icon, 64*64px * `KdanQPKG_80.gif` : App details 顯示的 icon, 80*80px, * `KdanQPKG_gray.gif` : `KdanQPKG.gif` 的 disable 版本, 64*64px * 若沒有這些圖片, 會用預設圖片 * 可在 QDK 路徑下, 找到這三張預設圖片(為隱藏檔案, `.`開頭), 確認尺寸等詳細資訊 * [官方文件](https://edhongcy.gitbooks.io/qdk-qpkg-development-kit/content/qdk-variables.html) 有提到詳細尺寸 * `build/` folder * 放最後 build 好的 QPKG 檔 * `config/` folder * 不知道幹嘛的 * `arm_64/`, `arm-x19/`, `arm-x31/`, `arm-x41/`, `x86/`, `x86_64/`, `x86_ce53xx/` * 放你的 code ( 給特定 cpu 架構 ), 用不到可以刪掉 * `shared/` * 放你的 code, 不區分 cpu 架構的部分都放這裡 (docker-compose 相關也是). * 其中會有預設的 sh 檔, 要負責程式 start, stop 等 shell 指令設定 ### Build QPKG * 建立專案內容 * (略, 參考下段 docker-compose 範例) * Build App 並安裝 (在你的 QPKG 專案 root folder 上) * `qbuild` : (把你的程式 build 成 QPKG 檔) * `cd build` : 結果放在 build 資料夾下 * `sh KdanQPKG_0.1.qpkg` : 直接執行 buid 出來的 qkpg 檔, 進行安裝 (或透過他的 QTS 介面, 上傳此檔案) * 安裝完, 在 QTS App Center 可看到你的 QPKG 出現, 可在此處 stop / remove reference : * [官方 QPKG Install Guide](https://edhongcy.gitbooks.io/qdk-quick-start-guide/content/build-your-own-qpkg.html) * [官方 QPKG Development Tool Kit](https://edhongcy.gitbooks.io/qdk-qpkg-development-kit/content/qpkg-configuration-file.html) * [QPKG 包裝範例](http://ilearnblogger.blogspot.com/2014/03/qnap-nas-install-qnap-app-with-qdk.html) * [docker-compose 包入 QPKG 範例](https://medium.com/@amosricky95/%E6%96%B0%E6%89%8B%E7%AD%86%E8%A8%98-%E5%AF%A6%E4%BD%9Crestful-api-with-dockerized-qpkg-%E4%BD%BF%E7%94%A8python-restframework-dqpkg-%E9%83%A8%E4%BB%BD-ba755e248498) * [官方 docker in QPKG Format](https://github.com/qnap-dev/docker-qdk2) * [官方 package_router 範例](https://github.com/qnap-dev/docker-qdk2/blob/master/example/nginx/package_routines)