Skip to content

Instantly share code, notes, and snippets.

@nguyenquy0710
Last active December 16, 2024 07:17
Show Gist options
  • Select an option

  • Save nguyenquy0710/7b4598ea2e22cea6f8c4d4005df7e1ee to your computer and use it in GitHub Desktop.

Select an option

Save nguyenquy0710/7b4598ea2e22cea6f8c4d4005df7e1ee to your computer and use it in GitHub Desktop.
[DocFX - Hướng dẫn cài đặt, cấu hình sử dụng](https://blogs.nhquydev.net/ung-dung/docfx/docfx-huong-dan-cai-dat-cau-hinh-su-dung)
:: Tắt việc hiển thị lệnh khi chạy script, chỉ hiển thị kết quả.
@echo off
:: -------------------------------------------
:: Bước 1: Lấy dữ liệu từ systeminfo
:: -------------------------------------------
:: Lấy ngày và giờ hiện tại
set DATE_NOW=%DATE%
set TIME_NOW=%TIME%
:: Tách các phần của ngày (ngày, tháng, năm) và giờ (giờ, phút, giây)
:: Giả sử định dạng ngày là dd/MM/yyyy
set DAY=%DATE_NOW:~0,2%
set MONTH=%DATE_NOW:~3,2%
set YEAR=%DATE_NOW:~6,4%
:: Giả sử định dạng giờ là HH:mm:ss
set HOUR=%TIME_NOW:~0,2%
set MINUTE=%TIME_NOW:~3,2%
set SECOND=%TIME_NOW:~6,2%
:: Xử lý để loại bỏ dấu cách thừa trong giờ nếu có (do hệ thống có thể thêm dấu cách nếu giờ < 10)
if "%HOUR:~0,1%"==" " set HOUR=0%HOUR:~1,1%
:: Tạo phiên bản theo định dạng YYYYMMDDHHmmss
set VERSION=%YEAR%%MONTH%%DAY%%HOUR%%MINUTE%%SECOND%
:: Tạo biến `CURRENT_DAY` theo định dạng YYYY-MM-DD.
set CURRENT_DAY=%YEAR%-%MONTH%-%DAY%
:: -------------------------------------------
:: Bước 2: Định nghĩa các biến cần thiết
:: -------------------------------------------
:: Lấy tên file của script hiện tại (bao gồm tên và phần mở rộng).
set NAME_FILE_SCRIPT=%~nx0
:: Lấy đường dẫn hiện tại (current directory), thư mục làm việc.
set PROJECT_DIR=%cd%
:: Đặt thư mục đích (artifact)
set ARTIFACT_DIR=".\artifacts"
:: Thư mục xuất ra tài liệu DocFX sau khi build.
set OUTPUT_DIR=%ARTIFACT_DIR%\docfx
:: Đặt thư mục đích (dest)
set DEST_DIR=%ARTIFACT_DIR%\dest
:: Đường dẫn đến file cấu hình DocFX (docfx.json).
set CONFIG_PATH=".\quyit-docfx\docfx.json"
:: Gán giá trị của các tham số dòng lệnh vào các biến ARG_1 và ARG_2.
set ARG_1=%1
set ARG_2=%2
:: Kiểm tra DocFX đã được cài đặt.
docfx --version >nul 2>&1
if %errorlevel% equ 0 (
for /f "tokens=*" %%i in ('docfx --version') do set DOCFX_VERSION=%%i
echo You are using DocFX version: %DOCFX_VERSION%
) else (
echo You have not installed DocFX. See the installation guide at https://blogs.nhquydev.net/ung-dung/docfx/docfx-huong-dan-cai-dat-cau-hinh-su-dung
:: Nếu không có tham số hợp lệ nào, chuyển đến nhãn :end để kết thúc script.
goto :end
)
:: Chuyển đến nhãn :menu_arg_1 để xử lý tham số dòng lệnh đầu tiên.
goto :menu_arg_1
:menu_arg_1
:: -------------------------------------------
:: Kiểm tra tham số và chuyển đến nhãn tương ứng
:: -------------------------------------------
echo Chuyen den nhan thu 1: %ARG_1%
if "%ARG_1%"=="--build" goto :case_build
if "%ARG_1%"=="--help" goto :case_help
if "%ARG_1%"=="--serve" goto :case_serve
if "%ARG_1%"=="--deploy" goto :case_deploy
:: Nếu không có tham số hợp lệ nào, chuyển đến nhãn :case_help để hiển thị hướng dẫn.
goto :case_help
:menu_arg_2
:: -------------------------------------------
:: Kiểm tra tham số thứ 2 và chuyển đến nhãn tương ứng
:: -------------------------------------------
echo Chuyen den nhan thu 2: %ARG_2%
if "%ARG_2%"=="--serve" goto :case_serve
if "%ARG_2%"=="--deploy" goto :case_deploy
if "%ARG_2%"=="--git" goto :case_build_arg_git
if "%ARG_2%"=="--pdf" goto :case_build_arg_pdf
:: Nếu không có tham số hợp lệ nào, chuyển đến nhãn :end để kết thúc script.
goto :end
:case_help
:: -------------------------------------------
:: Hiển thị hướng dẫn chi tiết cách sử dụng script
:: -------------------------------------------
echo -----------------------------------------------------------
echo File script: %NAME_FILE_SCRIPT%
echo Ngay tao: 11/12/2024
echo Tac gia: [Nguyen Quy](quynh@vihatgroup.com)
echo -----------------------------------------------------------
echo Huong dan su dung script batch:
echo 1. Build tai lieu DocFX:
echo %NAME_FILE_SCRIPT% --build
echo 2. Build va xuat tai lieu ra file pdf:
echo %NAME_FILE_SCRIPT% --build --pdf
echo 3. Build tai lieu va commit push (Git nhanh main/ develop):
echo %NAME_FILE_SCRIPT% --build --git
echo 4. Build va serve tai lieu (mo trinh duyet):
echo %NAME_FILE_SCRIPT% --build --serve
echo 5. Build va zip tai lieu:
echo %NAME_FILE_SCRIPT% --build --deploy
echo 6. Zip tai lieu de trien khai:
echo %NAME_FILE_SCRIPT% --deploy
echo 7. Serve tai lieu (mo trinh duyet):
echo %NAME_FILE_SCRIPT% --serve
echo 8. Hien thi huong dan su dung:
echo %NAME_FILE_SCRIPT% --help
echo -----------------------------------------------------------
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:case_serve
:: -------------------------------------------
:: Serve tài liệu DocFX và mở trình duyệt
:: -------------------------------------------
echo "Starting DocFX serve..."
:: Chạy lệnh `docfx serve` để serve tài liệu từ thư mục OUTPUT_DIR và tự động mở trình duyệt.
:: USAGE: docfx serve [directory] [OPTIONS]
:: ARGUMENTS: [directory] Path to docfx.json
call docfx serve "%OUTPUT_DIR%" --open-browser
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:case_deploy
:: -------------------------------------------
:: zip output để triển khai
:: -------------------------------------------
:: Đặt tên file zip chứa nội dung đã nén, sử dụng thư mục lưu trữ %ARTIFACT_DIR% và tên phiên bản %VERSION%
set ZIP_FILE=%ARTIFACT_DIR%\dest-%VERSION%.zip
:: Tạo thư mục dest nếu chưa tồn tại
if not exist "%DEST_DIR%" (
mkdir "%DEST_DIR%"
) else (
:: Nếu thư mục đã tồn tại, xóa các tệp và thư mục con
echo Deleting files and subdirectories in "%DEST_DIR%"...
:: Xóa tất cả tệp trong thư mục DEST_DIR
del /q /f "%DEST_DIR%\*" >nul
:: Xóa tất cả các thư mục con trong DEST_DIR
for /d %%i in ("%DEST_DIR%\*") do rd /s /q "%%i"
)
:: Sao chép file cấu hình docfx.json vào thư mục dest
:: echo Copying docfx.json to dest...
:: copy /Y "%CONFIG_PATH%" "%DEST_DIR%\docfx.json" >nul
:: Kiểm tra xem có phải thư mục hiện tại là một thư mục Git repository không.
:: Nếu không phải, lệnh này sẽ trả về lỗi.
git rev-parse --is-inside-work-tree >nul 2>nul
:: Nếu lỗi (Git chưa được khởi tạo), hiển thị thông báo và kết thúc script.
if errorlevel 1 (
:: Ghi giá trị của VERSION vào file version.txt trong thư mục DEST_DIR để lưu trữ thông tin phiên bản
echo %VERSION% > "%DEST_DIR%\version.txt"
) else (
echo %VERSION% > "%DEST_DIR%\version.txt"
git describe --tags > "%DEST_DIR%\version.txt"
)
:: Sao chép thư mục _site từ %OUTPUT_DIR% vào thư mục DEST_DIR\_site, giữ nguyên cấu trúc thư mục
echo Copying _site to dest...
xcopy /Y "%OUTPUT_DIR%" "%DEST_DIR%" /E /I
:: Nén thư mục dest vào file zip với phiên bản hiện tại
echo Creating zip archive of the dest folder with version %VERSION%...
:: Sử dụng PowerShell để nén thư mục %DEST_DIR% thành file ZIP với tên %ZIP_FILE%,
:: tùy chọn -Force dùng để ép ghi đè nếu file đã tồn tại
powershell Compress-Archive -Path "%DEST_DIR%" -DestinationPath "%ZIP_FILE%" -Force
:: Khởi động DocFX để phục vụ trang web tĩnh từ thư mục _site, mở trình duyệt mặc định
call docfx serve "%DEST_DIR%" --open-browser
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:case_build
:: -------------------------------------------
:: Build tài liệu DocFX
:: -------------------------------------------
:: Chạy lệnh `docfx metadata` để thu thập metadata từ các dự án để xây dựng tài liệu DocFX.
:: USAGE: docfx metadata [config] [OPTIONS]
:: ARGUMENTS: [config] Path to docfx.json
call docfx metadata "%CONFIG_PATH%" --warningsAsErrors
:: Chạy lệnh `docfx build` để xây dựng tài liệu DocFX từ file cấu hình `docfx.json`
:: và xuất ra thư mục OUTPUT_DIR. Thêm metadata và các tùy chọn xuất dữ liệu.
call docfx build "%CONFIG_PATH%" --output %OUTPUT_DIR% --exportRawModel true --exportViewModel true
:: Chạy lệnh `docfx pdf` để xuất tài liệu DocFX dưới dạng file PDF và lưu vào thư mục OUTPUT_DIR.
:: call docfx pdf "%CONFIG_PATH%" --output %OUTPUT_DIR%
:: Quay lại nhãn :menu_arg_2 để kiểm tra tham số thứ 2.
goto :menu_arg_2
:case_build_arg_git
:: -------------------------------------------
:: Kiểm tra nhánh Git hiện tại và kiểm tra cài đặt Git
:: -------------------------------------------
:: Kiểm tra xem có phải thư mục hiện tại là một thư mục Git repository không.
:: Nếu không phải, lệnh này sẽ trả về lỗi.
git rev-parse --is-inside-work-tree >nul 2>nul
:: Nếu lỗi (Git chưa được khởi tạo), hiển thị thông báo và kết thúc script.
if errorlevel 1 (
echo "Git is not initialized in the current directory. Please initialize Git first."
goto :end
)
:: Lấy tên nhánh Git hiện tại và lưu vào biến `branch`.
for /f "delims=" %%b in ('git rev-parse --abbrev-ref HEAD') do set branch=%%b
:: Nếu nhánh hiện tại là "main" hoặc "develop", chuyển đến nhãn :gitPush để thực hiện push.
if "%branch%"=="main" goto :gitPush
if "%branch%"=="develop" goto :gitPush
:: Nếu nhánh hiện tại không phải "main" hoặc "develop", hiển thị thông báo và không thực hiện push.
echo "Current branch (%branch%) is not main or develop. Skipping git push."
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:case_build_arg_pdf
:: -------------------------------------------
:: Xuất tài liệu DocFX dưới dạng file PDF
:: -------------------------------------------
:: Chạy lệnh `docfx pdf` để xuất tài liệu DocFX dưới dạng file PDF và lưu vào thư mục OUTPUT_DIR.
call docfx pdf "%CONFIG_PATH%" --output %OUTPUT_DIR%
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:gitPush
:: -------------------------------------------
:: Kiểm tra cài đặt Git và Push thay đổi lên Git
:: -------------------------------------------
:: Kiểm tra xem có phải thư mục hiện tại là một thư mục Git repository không.
:: Nếu không phải, lệnh này sẽ trả về lỗi.
git rev-parse --is-inside-work-tree >nul 2>nul
:: Nếu lỗi (Git chưa được khởi tạo), hiển thị thông báo và kết thúc script.
if errorlevel 1 (
echo "Git is not initialized in the current directory. Please initialize Git first."
goto :end
)
echo "Starting Git push..."
call git add .
call git commit -m "%CURRENT_DAY%: deploy docfx"
call git push
:: Chuyển đến nhãn :end để kết thúc script.
goto :end
:: Dừng script và chờ người dùng nhấn phím trước khi thoát.
:end
pause
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment