KarelWintersky 已修改 4 days ago. 還原成這個修訂版本
2 files changed, 159 insertions
build_phar.sh(檔案已創建)
| @@ -0,0 +1,120 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | set -e | |
| 3 | + | ||
| 4 | + | PROJECT_DIR="$(basename "$(pwd)")" | |
| 5 | + | echo "Building $PROJECT_DIR PHAR..." | |
| 6 | + | ||
| 7 | + | IMAGE_NAME="phar-builder-universal" | |
| 8 | + | ||
| 9 | + | # ---- Read box.json ---- | |
| 10 | + | if [ ! -f "box.json" ]; then | |
| 11 | + | echo "Error: box.json not found" | |
| 12 | + | exit 1 | |
| 13 | + | fi | |
| 14 | + | ||
| 15 | + | BOX_MAIN=$(php -r "echo json_decode(file_get_contents('box.json'), true)['main'] ?? 'index.php';") | |
| 16 | + | BOX_OUTPUT=$(php -r "echo json_decode(file_get_contents('box.json'), true)['output'] ?? 'output.phar';") | |
| 17 | + | VERSION_DIR=$(dirname "$BOX_MAIN") | |
| 18 | + | ||
| 19 | + | echo " Main script: $BOX_MAIN" | |
| 20 | + | echo " Output PHAR: $BOX_OUTPUT" | |
| 21 | + | ||
| 22 | + | # ---- Rebuild image if requested ---- | |
| 23 | + | if [ "$1" = "--rebuild" ]; then | |
| 24 | + | echo "Removing existing image $IMAGE_NAME for rebuild..." | |
| 25 | + | docker rmi "$IMAGE_NAME" 2>/dev/null || true | |
| 26 | + | fi | |
| 27 | + | ||
| 28 | + | # ---- Build image only once ---- | |
| 29 | + | if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then | |
| 30 | + | echo "Image $IMAGE_NAME not found, building..." | |
| 31 | + | ||
| 32 | + | TMP_DOCKERFILE="/tmp/grasp_phar_builder.Dockerfile" | |
| 33 | + | trap 'rm -f "$TMP_DOCKERFILE"' EXIT | |
| 34 | + | ||
| 35 | + | if [ -f "box.phar" ]; then | |
| 36 | + | echo "Found local box.phar, will COPY it into image" | |
| 37 | + | BOX_INSTALL="COPY box.phar /usr/local/bin/box | |
| 38 | + | RUN chmod +x /usr/local/bin/box" | |
| 39 | + | else | |
| 40 | + | echo "box.phar not found locally, will download from GitHub" | |
| 41 | + | BOX_INSTALL="RUN curl -LSs https://github.com/box-project/box/releases/download/4.5.0/box.phar -o /usr/local/bin/box && chmod +x /usr/local/bin/box" | |
| 42 | + | fi | |
| 43 | + | ||
| 44 | + | cat > "$TMP_DOCKERFILE" << DOCKERFILE | |
| 45 | + | FROM php:8.3-cli | |
| 46 | + | ||
| 47 | + | RUN apt-get update && apt-get install -y \ | |
| 48 | + | git unzip curl \ | |
| 49 | + | libbz2-dev liblz4-dev libzstd-dev libzip-dev \ | |
| 50 | + | libwebp-dev libjpeg-dev libpng-dev libfreetype-dev \ | |
| 51 | + | libmagickwand-dev \ | |
| 52 | + | libsodium-dev libssl-dev \ | |
| 53 | + | libpq-dev libsqlite3-dev unixodbc-dev libldap-dev \ | |
| 54 | + | libxml2-dev libxslt1-dev \ | |
| 55 | + | libicu-dev libgmp-dev libonig-dev \ | |
| 56 | + | libedit-dev libkrb5-dev libsnmp-dev libtidy-dev libmemcached-dev \ | |
| 57 | + | && rm -rf /var/lib/apt/lists/* | |
| 58 | + | ||
| 59 | + | RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ | |
| 60 | + | && docker-php-ext-install -j\$(nproc) \ | |
| 61 | + | bcmath bz2 calendar dom exif fileinfo ftp \ | |
| 62 | + | gd gettext gmp iconv intl ldap mbstring mysqli \ | |
| 63 | + | opcache pcntl pdo pdo_mysql pdo_pgsql pdo_sqlite pgsql phar \ | |
| 64 | + | posix simplexml snmp soap sockets \ | |
| 65 | + | sodium sqlite3 tidy xml \ | |
| 66 | + | xmlreader xmlwriter xsl zip \ | |
| 67 | + | || echo "Some core extensions failed (non-fatal)" | |
| 68 | + | ||
| 69 | + | RUN pecl install imagick redis apcu xmlrpc || echo "Some PECL extensions failed (non-fatal)" | |
| 70 | + | RUN pecl install memcached lz4 zstd rar || echo "Some PECL extensions failed (non-fatal)" | |
| 71 | + | RUN docker-php-ext-enable imagick redis apcu xmlrpc memcached lz4 zstd rar || true | |
| 72 | + | ||
| 73 | + | COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer | |
| 74 | + | ||
| 75 | + | ${BOX_INSTALL} | |
| 76 | + | ||
| 77 | + | WORKDIR /app | |
| 78 | + | DOCKERFILE | |
| 79 | + | ||
| 80 | + | docker build -f "$TMP_DOCKERFILE" -t "$IMAGE_NAME" . | |
| 81 | + | echo "Image $IMAGE_NAME built" | |
| 82 | + | else | |
| 83 | + | echo "Using existing image $IMAGE_NAME (pass --rebuild to rebuild)" | |
| 84 | + | fi | |
| 85 | + | ||
| 86 | + | CURRENT_UID=$(id -u) | |
| 87 | + | CURRENT_GID=$(id -g) | |
| 88 | + | ||
| 89 | + | echo "Running build..." | |
| 90 | + | docker run --rm \ | |
| 91 | + | -v "$(pwd)":/app \ | |
| 92 | + | -e HOST_UID=$CURRENT_UID \ | |
| 93 | + | -e HOST_GID=$CURRENT_GID \ | |
| 94 | + | "$IMAGE_NAME" sh -c " | |
| 95 | + | echo ' Installing dependencies...' && \ | |
| 96 | + | composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --ignore-platform-req=ext-redis && \ | |
| 97 | + | echo ' Generating version file...' && \ | |
| 98 | + | if git rev-parse --git-dir > /dev/null 2>&1; then \ | |
| 99 | + | mkdir -p $VERSION_DIR && \ | |
| 100 | + | git rev-parse --short HEAD > $VERSION_DIR/_version && \ | |
| 101 | + | git log --oneline --format=%B -n 1 HEAD | head -n 1 >> $VERSION_DIR/_version && \ | |
| 102 | + | git log --oneline --format=\"%at\" -n 1 HEAD | xargs -I{} date -d @{} +%Y-%m-%d >> $VERSION_DIR/_version && \ | |
| 103 | + | echo ' Version file written to $VERSION_DIR/_version'; \ | |
| 104 | + | else \ | |
| 105 | + | echo ' Not a git repository, skipping _version'; \ | |
| 106 | + | fi && \ | |
| 107 | + | echo ' Compiling PHAR...' && \ | |
| 108 | + | box compile && \ | |
| 109 | + | echo ' Fixing permissions...' && \ | |
| 110 | + | chown \${HOST_UID}:\${HOST_GID} /app/$BOX_OUTPUT && \ | |
| 111 | + | echo 'Done!' | |
| 112 | + | " | |
| 113 | + | ||
| 114 | + | if [ -f "$BOX_OUTPUT" ]; then | |
| 115 | + | echo "PHAR ready:" | |
| 116 | + | ls -lh "$BOX_OUTPUT" | |
| 117 | + | else | |
| 118 | + | echo "Error: $BOX_OUTPUT was not created." | |
| 119 | + | exit 1 | |
| 120 | + | fi | |
example_box.json(檔案已創建)
| @@ -0,0 +1,39 @@ | |||
| 1 | + | { | |
| 2 | + | "chmod": "0755", | |
| 3 | + | "compactors": [ | |
| 4 | + | "KevinGH\\Box\\Compactor\\Php", | |
| 5 | + | "KevinGH\\Box\\Compactor\\Json" | |
| 6 | + | ], | |
| 7 | + | "compression": "GZ", | |
| 8 | + | "main": "test_send.php", | |
| 9 | + | "output": "mailer.phar", | |
| 10 | + | "finder": [ | |
| 11 | + | { | |
| 12 | + | "name": ["*.php", "*.json", "*.h", "*.so", "*.dll"], | |
| 13 | + | "in": "vendor", | |
| 14 | + | "exclude": [ | |
| 15 | + | ".github", | |
| 16 | + | ".editorconfig", | |
| 17 | + | "infection.json.dist", | |
| 18 | + | ".php-cs-fixer.dist.php", | |
| 19 | + | ".valgrindc", | |
| 20 | + | "*.exe", | |
| 21 | + | "*.md", | |
| 22 | + | "LICENSE", | |
| 23 | + | "psalm.xml", | |
| 24 | + | "test", | |
| 25 | + | "tests", | |
| 26 | + | "Tests", | |
| 27 | + | "examples", | |
| 28 | + | ".gitignore", | |
| 29 | + | ".hhconfig", | |
| 30 | + | ".travis*", | |
| 31 | + | "phpunit*", | |
| 32 | + | "docs", | |
| 33 | + | "doc" | |
| 34 | + | ] | |
| 35 | + | } | |
| 36 | + | ], | |
| 37 | + | "dump-autoload": true, | |
| 38 | + | "check-requirements": false | |
| 39 | + | } | |
上一頁
下一頁