Web-ΡΠ΅ΡΠ²ΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΊΠ½ΠΈΠ³ ΠΏΠΎ INPX-ΠΈΠ½Π΄Π΅ΠΊΡΡ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ OPDS.
- π ΠΠ°ΡΡΠΈΠ½Π³ INPX - ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ
- π ΠΠΎΠ»Π½ΠΎΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΠΏΠΎΠΈΡΠΊ - SQLite FTS5 ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ, ΡΠ΅ΡΠΈΠΈ, Π°Π²ΡΠΎΡΠ°ΠΌ ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ
- π Web ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ - ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ SPA Π½Π° Vue.js
- π± ΠΠ΄Π°ΠΏΡΠΈΠ²Π½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ - ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ
- π OPDS ΠΊΠ°ΡΠ°Π»ΠΎΠ³ - ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΡΠΈΡΠ°Π»ΠΊΠ°ΠΌΠΈ
- ποΈ Π€ΠΈΠ»ΡΡΡΠ°ΡΠΈΡ - ΠΏΠΎ ΠΆΠ°Π½ΡΠ°ΠΌ, ΡΠ΅ΡΠΈΡΠΌ, Π°Π²ΡΠΎΡΠ°ΠΌ, Π³ΠΎΠ΄Π°ΠΌ
- β‘ ΠΡΡΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ° - SQLite Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ
# Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π΄Π»Ρ ΠΊΠ½ΠΈΠ³
mkdir -p books
# ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΡΠ΄Π° Π²Π°ΡΠΈ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈ INPX ΡΠ°ΠΉΠ» (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, books/index.inpx)
# ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker compose up -dΠ‘Π΅ΡΠ²ΠΈΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:9090:
- Web ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ: http://localhost:9090/
- API: http://localhost:9090/api/v1/books
- OPDS ΠΊΠ°ΡΠ°Π»ΠΎΠ³: http://localhost:9090/opds
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π² docker-compose.yaml:
environment:
- PORT=9090
- BOOKS_DIR=/data/books
- INPX_PATH=/data/books/index.inpx
- CATALOG_TITLE=Pushkinlib Library
- PUBLIC_BASE_URL=http://localhost:9090ΠΠ»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
docker-compose.dev.yaml, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΠΎΠ±ΡΠ°Π· Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ:docker compose -f docker-compose.dev.yaml up -d
CGO_ENABLED=1 go build -tags sqlite_fts5 -o pushkinlib ./cmd/pushkinlibΠΠΎΠΈΡΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠΎΠ΄ΡΠ»Ρ SQLite FTS5, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ±ΠΎΡΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ Π²ΠΊΠ»ΡΡΡΠ½Π½ΡΠΌ CGO ΠΈ ΡΠ΅Π³ΠΎΠΌ
sqlite_fts5.
Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
cp .env.example .envΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² .env:
PORT=9090
BOOKS_DIR=/path/to/books
INPX_PATH=/path/to/catalog.inpx
CATALOG_TITLE=ΠΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
PUBLIC_BASE_URL=http://localhost:9090
GENRES_CSV_PATH=./web/static/genres.csv./pushkinlibΠΠ»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ
Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΆΠ°Π½ΡΠΎΠ² Π² OPDS ΠΈ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ CSV-ΡΠ°ΠΉΠ» GENRES_CSV_PATH (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ./web/static/genres.csv). ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ ΠΆΠ°Π½ΡΠΎΠ².
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΏΠ°ΠΏΠΊΠ° Ρ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ, Π½ΠΎ Π½Π΅Ρ INPX ΡΠ°ΠΉΠ»Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°:
CGO_ENABLED=1 go build -tags sqlite_fts5 -o catalog-generator ./cmd/catalog-generatorΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΏΠ°ΠΏΠΊΡ ./sample-data/books/:
sample-data/books/
βββ book1.fb2
βββ book2.zip
βββ book3.epub
βββ subfolder/
βββ book4.fb2
./catalog-generator -books=./sample-data/books -name=my_catalogΠΠΏΡΠΈΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ°:
-books- ΠΏΠ°ΠΏΠΊΠ° Ρ ΠΊΠ½ΠΈΠ³Π°ΠΌΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:./sample-data/books)-output- ΠΏΠ°ΠΏΠΊΠ° Π΄Π»Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:./sample-data)-name- ΠΈΠΌΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:generated_catalog)-prefix- ΠΏΡΠ΅ΡΠΈΠΊΡ Π΄Π»Ρ Π°ΡΡ ΠΈΠ²ΠΎΠ² (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:books)-max-books- ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΊΠ½ΠΈΠ³ Π² Π°ΡΡ ΠΈΠ²Π΅ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: 1000)-formats- ΡΠΎΡΠΌΠ°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ:.fb2,.zip,.epub)
ΠΠΎΡΠ»Π΅ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ .env:
INPX_PATH=./sample-data/my_catalog.inpx
BOOKS_DIR=./sample-data- FB2 - ΠΏΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
- FB2.ZIP - FB2 ΡΠ°ΠΉΠ»Ρ Π² ZIP Π°ΡΡ ΠΈΠ²Π°Ρ
- EPUB - Π±Π°Π·ΠΎΠ²Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° (Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π°Π²ΡΠΎΡ)
- INPX - ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²
- INP - ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠ²
ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ ΠΎΡΠΈΡΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΡΡ SQLite-Π±Π°Π·Ρ ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ INPX. ΠΠ° ΡΡΠΎ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ POST-ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π·Π°ΡΠΈΡΠΈΡΡ Π΅Π³ΠΎ Basic Auth / reverse proxy):
POST /admin/reindexΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ° Π±Π΅Π· Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ:
curl -X POST http://localhost:9090/admin/reindexΠΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΡΠ½ Basic Auth, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ:
curl -u user:pass -X POST http://localhost:9090/admin/reindexΠ ΠΎΡΠ²Π΅ΡΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ°: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠ½ΠΈΠ³, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
. Π’ΠΎΡ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎΠ΄ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ API (POST /api/v1/admin/reindex) ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π°ΠΏΡΡΠΊΠ΅, Π΅ΡΠ»ΠΈ Π±Π°Π·Π° ΠΏΡΡΡΠ°.
GET /api/v1/books?q=Π·Π°ΠΏΡΠΎΡ&limit=30&offset=0ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
q- ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΉ Π·Π°ΠΏΡΠΎΡlimit- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: 30)offset- ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠ°Π³ΠΈΠ½Π°ΡΠΈΠΈauthors[]- ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π°Π²ΡΠΎΡΠ°ΠΌseries[]- ΡΠΈΠ»ΡΡΡ ΠΏΠΎ ΡΠ΅ΡΠΈΡΠΌgenres[]- ΡΠΈΠ»ΡΡΡ ΠΏΠΎ ΠΆΠ°Π½ΡΠ°ΠΌyear_from,year_to- ΡΠΈΠ»ΡΡΡ ΠΏΠΎ Π³ΠΎΠ΄Π°ΠΌsort_by- ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° (title,year,date_added,relevance)sort_order- ΠΏΠΎΡΡΠ΄ΠΎΠΊ (asc,desc)
Π€ΡΠΎΠ½ΡΠ΅Π½Π΄ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΆΠ°Π½ΡΠΎΠ², ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ β ΠΈΠΌΡ ΠΈΠ· web/static/genres.csv. ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠΉΡΠ΅ ΠΏΠ°ΡΡ Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅ΡΠ±ΠΎΡΠΊΠΈ.
GET /api/v1/books/{id}OPDS ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ /opds ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ:
- ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ - ΠΏΠΎ Π°Π²ΡΠΎΡΠ°ΠΌ, ΡΠ΅ΡΠΈΡΠΌ, ΠΆΠ°Π½ΡΠ°ΠΌ
- ΠΠΎΠΈΡΠΊ - ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ OpenSearch
- ΠΠ°Π³ΠΈΠ½Π°ΡΠΈΡ - Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
- Π‘ΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ - ΠΏΡΡΠΌΡΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ°ΠΉΠ»Ρ
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π² Π²Π°ΡΡ ΡΠΈΡΠ°Π»ΠΊΡ OPDS ΠΊΠ°ΡΠ°Π»ΠΎΠ³:
http://your-server:9090/opds
ΠΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΡΠ°Π»ΠΊΠΈ:
- FBReader
- KyBook
- Bookari
- Moon+ Reader
pushkinlib/
βββ cmd/
β βββ pushkinlib/ # ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
β βββ catalog-generator/ # ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
βββ internal/
β βββ api/ # HTTP API handlers
β βββ auth/ # ΠΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ
β βββ catalog/ # ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ²
β βββ config/ # ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
β βββ covers/ # ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΠ±Π»ΠΎΠΆΠ΅ΠΊ
β βββ inpx/ # ΠΠ°ΡΡΠΈΠ½Π³ INPX
β βββ metadata/ # ΠΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
β βββ opds/ # OPDS ΠΊΠ°ΡΠ°Π»ΠΎΠ³
β βββ search/ # ΠΠΎΠΈΡΠΊ ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ
β βββ storage/ # ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ
βββ web/static/ # Frontend (Vue.js SPA)
β βββ vendor/ # ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ JS Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
βββ scripts/ # ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡ
βββ sample-data/ # Π’Π΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
Web-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ (Vue.js, Axios) Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π±Π΅Π· Π²Π½Π΅ΡΠ½ΠΈΡ CDN. ΠΠ»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ:
./scripts/download-deps.shΠ‘ΠΊΡΠΈΠΏΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΠΈΠ· unpkg.com Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ web/static/vendor/.
# ΠΠ°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΎΠ²
go test ./...
# Π’Π΅ΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ° INPX
go test ./internal/inpx -v
# ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°
./catalog-generator -books=./sample-data/booksMIT License
- Fork ΠΏΡΠΎΠ΅ΠΊΡΠ°
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ feature branch (
git checkout -b feature/amazing-feature) - Commit ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ (
git commit -m 'Add amazing feature') - Push Π² branch (
git push origin feature/amazing-feature) - ΠΡΠΊΡΠΎΠΉΡΠ΅ Pull Request
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π²ΠΎΠΏΡΠΎΡΡ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ issue Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ GitHub.