YAMPD/build.py

110 lines
No EOL
3.4 KiB
Python

import subprocess
import os
import shutil
import argparse
OUT_DIR = "./dist"
parser = argparse.ArgumentParser(
prog="Yet Another MineCraft ModPack Downloader",
description="Create and Download mod packs with ease",
epilog="",
)
parser.add_argument(
"--no-rebuild", help="don't rebuild Next.js frontend", action="store_true", default=False
)
parser.add_argument(
"--exe", help="create an executable file", action="store_true", default=False
)
if __name__ == "__main__":
args = parser.parse_args()
if os.path.exists(OUT_DIR) and os.path.isdir(OUT_DIR):
shutil.rmtree(OUT_DIR)
os.makedirs(OUT_DIR)
# TODO: handle multiple package managers line npm(node), deno, yarn
# TODO?: install node deps automatically
if not args.no_rebuild:
build = subprocess.call(["bun", "run", "build"], cwd="./gui", shell=True)
if build != 0:
print("[ERROR] Next.js gui has failed to build")
raise
print("Scanning Next.js out directory...")
files = [f.name for f in os.scandir("./gui/out") if f.is_file()]
dirs = [f.name for f in os.scandir("./gui/out") if f.is_dir()]
os.makedirs(f"{OUT_DIR}/static")
os.makedirs(f"{OUT_DIR}/templates")
for file in files:
if file.endswith(".html"):
print(f"Copied page: './gui/out/{file}' -> '{OUT_DIR}/templates/{file}'")
shutil.copyfile(f"./gui/out/{file}", f"{OUT_DIR}/templates/{file}")
continue
print(f"Copied asset: './gui/out/{file}' -> '{OUT_DIR}/static/{file}'")
shutil.copyfile(f"./gui/out/{file}", f"{OUT_DIR}/static/{file}")
for dir in dirs:
if dir == "_next":
print(f"Copied directory: './gui/out/{dir}' -> '{OUT_DIR}/static/{dir}'")
shutil.copytree(
f"./gui/out/{dir}", f"{OUT_DIR}/static/{dir}", dirs_exist_ok=True
)
continue
print(f"Copied directory: './gui/out/{dir}' -> '{OUT_DIR}/templates/{dir}'")
shutil.copytree(
f"./gui/out/{dir}", f"{OUT_DIR}/templates/{dir}", dirs_exist_ok=True
)
print(f"Copied app: './src' -> '{OUT_DIR}'")
shutil.copytree("./src", f"{OUT_DIR}/", dirs_exist_ok=True)
print(
f"Copied requirements.txt: './requirements.txt' -> '{OUT_DIR}/requirements.txt'"
)
shutil.copyfile(f"./requirements.txt", f"{OUT_DIR}/requirements.txt")
if args.exe:
build = subprocess.call(
[
"pyinstaller",
"main.py",
"-F",
"--add-data",
"static:static",
"--add-data",
"templates:templates",
],
cwd="./dist",
shell=True,
)
if build != 0:
print("[ERROR] pyinstaller has failed to build an app")
raise
if os.path.exists(f"{OUT_DIR}/dist/main.exe"):
shutil.move(f"{OUT_DIR}/dist/main.exe", f"{OUT_DIR}/yamcpack.exe")
elif os.path.exists(f"{OUT_DIR}/dist/main"):
shutil.move(f"{OUT_DIR}/dist/main", f"{OUT_DIR}/yamcpack")
else:
print("[ERROR] no executable found")
raise
print("cleanup...")
shutil.rmtree(f"{OUT_DIR}/dist")
shutil.rmtree(f"{OUT_DIR}/build")
os.remove(f"{OUT_DIR}/main.spec")
if os.path.exists(f"{OUT_DIR}/__pycache__") and os.path.isdir(
f"{OUT_DIR}/__pycache__"
):
shutil.rmtree(f"{OUT_DIR}/__pycache__")