114 lines
5.6 KiB
Python
114 lines
5.6 KiB
Python
import argparse
|
|
import shutil
|
|
import sys
|
|
from pathlib import Path
|
|
from textwrap import dedent
|
|
import string
|
|
|
|
|
|
class CustomTemplate(string.Template):
|
|
delimiter = '@' # 使用自定义的占位符,例如@{}
|
|
|
|
|
|
def generateTemplateFile(source, dist, _mapping):
|
|
source_path = Path(source).absolute()
|
|
dist_path = Path(dist).absolute()
|
|
with open(source_path, 'r', encoding='utf-8') as _file:
|
|
content = _file.read()
|
|
|
|
template = CustomTemplate(content)
|
|
rendered_content = template.substitute(_mapping)
|
|
|
|
dist_path.parent.mkdir(parents=True, exist_ok=True)
|
|
with open(dist_path, 'w', encoding='utf-8') as _file:
|
|
_file.write(rendered_content)
|
|
|
|
|
|
TOOL_DESCRIPTION = dedent("""
|
|
create-fluent-app: A tool to bootstrap and manage Fluent UI applications.
|
|
|
|
This script provides an easy way to set up a new Fluent UI application with
|
|
predefined configurations and templates. It helps streamline the process of
|
|
creating and managing Fluent UI projects by automating repetitive tasks and
|
|
ensuring consistency across projects.
|
|
|
|
Usage examples:
|
|
1. To create a new Fluent UI project:
|
|
python create-fluent-app.py --name MyApp
|
|
2. To specify an output directory:
|
|
python create-fluent-app.py --out /path/to/output/dir
|
|
""")
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description=TOOL_DESCRIPTION)
|
|
parser.add_argument("-n", "--name", required=True,
|
|
help="Specify the name of the Fluent UI application to be created.")
|
|
parser.add_argument("-o", "--out", required=True,
|
|
help="Specify the output directory where the project will be created.")
|
|
args = parser.parse_args()
|
|
app_name = args.name
|
|
output_dir = Path(args.out)
|
|
project_dir = output_dir / app_name
|
|
project_sub_dir = output_dir / app_name / app_name
|
|
project_cmake_dir = project_sub_dir / '.cmake'
|
|
project_favicon_dir = project_sub_dir / 'favicon'
|
|
if not output_dir.is_dir():
|
|
print(f"Error: The specified output directory '{output_dir}' is not a valid directory.")
|
|
sys.exit(1)
|
|
if project_dir.exists():
|
|
print(f"Error: The project '{app_name}' already exists in the directory '{output_dir}'.")
|
|
sys.exit(1)
|
|
try:
|
|
project_dir.mkdir(parents=True, exist_ok=False)
|
|
project_cmake_dir.mkdir(parents=True, exist_ok=False)
|
|
project_favicon_dir.mkdir(parents=True, exist_ok=False)
|
|
except Exception as e:
|
|
print(f"Error: Failed to create the project directory '{project_dir}'. {e}")
|
|
try:
|
|
shutil.copytree(Path('FluentUI'), project_dir / 'FluentUI')
|
|
except Exception as e:
|
|
print(f"Error: Failed to copy FluentUI files to the project directory. {e}")
|
|
sys.exit(1)
|
|
try:
|
|
shutil.copytree(Path('Gallery/runtime'), project_sub_dir / 'runtime')
|
|
except Exception as e:
|
|
print(f"Error: Failed to copy runtime files to the project directory. {e}")
|
|
sys.exit(1)
|
|
shutil.copytree(Path('designer'), project_dir / 'designer')
|
|
|
|
shutil.copy(Path('.gitignore'), project_dir)
|
|
shutil.copy(Path('.clang-format'), project_dir)
|
|
|
|
shutil.copy(Path('Gallery/favicon/favicon.ico'), project_favicon_dir)
|
|
shutil.copy(Path('Gallery/favicon/favicon.png'), project_favicon_dir)
|
|
shutil.copy(Path('Gallery/favicon/favicon.icns'), project_favicon_dir)
|
|
|
|
shutil.copy(Path('.template/logo.png'), project_sub_dir)
|
|
shutil.copy(Path('.template/en_US.ts'), project_sub_dir / (app_name + '_en_US.ts'))
|
|
shutil.copy(Path('.template/zh_CN.ts'), project_sub_dir / (app_name + '_zh_CN.ts'))
|
|
shutil.copy(Path('.template/en_US.qm'), project_sub_dir / (app_name + '_en_US.qm'))
|
|
shutil.copy(Path('.template/zh_CN.qm'), project_sub_dir / (app_name + '_zh_CN.qm'))
|
|
shutil.copy(Path('Gallery/.cmake/InstallerScript.iss.in'), project_cmake_dir / 'InstallerScript.iss.in')
|
|
shutil.copy(Path('Gallery/.cmake/MacOSXBundleInfo.plist.in'), project_cmake_dir / 'MacOSXBundleInfo.plist.in')
|
|
shutil.copy(Path('Gallery/.cmake/win_app.rc.in'), project_cmake_dir / 'win_app.rc.in')
|
|
|
|
shutil.copy(Path('Gallery/.cmake/linux.desktop.in'), project_cmake_dir / 'linux.desktop.in')
|
|
shutil.copy(Path('Gallery/.cmake/linux_control.in'), project_cmake_dir / 'linux_control.in')
|
|
shutil.copy(Path('Gallery/.cmake/linux_postinst.in'), project_cmake_dir / 'linux_postinst.in')
|
|
shutil.copy(Path('Gallery/.cmake/linux_postrm.in'), project_cmake_dir / 'linux_postrm.in')
|
|
|
|
mapping = dict(application_name=app_name)
|
|
generateTemplateFile(Path('.template/RootCMakeLists.txt.in'), project_dir / 'CMakeLists.txt', mapping)
|
|
generateTemplateFile(Path('.template/stdafx.h.in'), project_sub_dir / 'stdafx.h', mapping)
|
|
generateTemplateFile(Path('.template/App.qml.in'), project_sub_dir / 'App.qml', mapping)
|
|
generateTemplateFile(Path('.template/MainScreen.qml.in'), project_sub_dir / 'MainScreen.qml', mapping)
|
|
generateTemplateFile(Path('.template/MainWindow.qml.in'), project_sub_dir / 'MainWindow.qml', mapping)
|
|
generateTemplateFile(Path('.template/AppInfo.cpp.in'), project_sub_dir / 'AppInfo.cpp', mapping)
|
|
generateTemplateFile(Path('.template/AppInfo.h.in'), project_sub_dir / 'AppInfo.h', mapping)
|
|
generateTemplateFile(Path('.template/CMakeLists.txt.in'), project_sub_dir / 'CMakeLists.txt', mapping)
|
|
generateTemplateFile(Path('.template/Log.h.in'), project_sub_dir / 'Log.h', mapping)
|
|
generateTemplateFile(Path('.template/Log.cpp.in'), project_sub_dir / 'Log.cpp', mapping)
|
|
generateTemplateFile(Path('.template/main.cpp.in'), project_sub_dir / 'main.cpp', mapping)
|
|
|
|
print(f"Creating project '{app_name}' in '{output_dir}'.")
|