Compare commits

...

4 Commits

Author SHA1 Message Date
kuaifan
470772341f no message 2021-12-21 17:34:25 +08:00
kuaifan
675f00b8a0 no message 2021-12-21 17:02:07 +08:00
kuaifan
ae52803aec auto release 2021-12-21 16:52:21 +08:00
kuaifan
fb8cf78958 add workflows 2021-12-21 16:14:53 +08:00
6 changed files with 161 additions and 59 deletions

34
.github/workflows/electron.yml vendored Normal file
View File

@ -0,0 +1,34 @@
name: Build
on:
push:
branches: [ build ]
jobs:
build:
runs-on: ${{ matrix.os }}
environment: build
strategy:
matrix:
os: [macos-11]
platform: [
build-mac,
build-mac-arm,
build-win
]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Use Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 14.x
- name: Build
env:
GH_TOKEN: ${{ secrets.GH_PAT }}
run: ./cmd electron ${{ matrix.platform }}

20
cmd
View File

@ -87,7 +87,7 @@ run_compile() {
}
run_electron() {
local type=$1
local argv=$@
check_node
if [ ! -d "./electron/node_modules" ]; then
pushd electron
@ -97,11 +97,7 @@ run_electron() {
if [ -d "./electron/dist" ]; then
rm -rf "./electron/dist"
fi
if [ "$type" = "prod" ]; then
node ./electron/build.js --build
else
node ./electron/build.js
fi
node ./electron/build.js $argv
}
run_exec() {
@ -200,8 +196,10 @@ env_init() {
####################################################################################
####################################################################################
check_docker
env_init
if [[ "$1" != "electron" ]]; then
check_docker
env_init
fi
if [ $# -gt 0 ]; then
if [[ "$1" == "init" ]] || [[ "$1" == "install" ]]; then
@ -260,11 +258,7 @@ if [ $# -gt 0 ]; then
run_compile prod
elif [[ "$1" == "electron" ]]; then
shift 1
if [[ "$@" == "dev" ]]; then
run_electron dev
else
run_electron prod
fi
run_electron $@
elif [[ "$1" == "doc" ]]; then
shift 1
run_exec php "php app/Http/Controllers/Api/apidoc.php"

104
electron/build.js vendored
View File

@ -1,5 +1,4 @@
const fs = require('fs');
const fse = require('fs-extra')
const path = require('path')
const inquirer = require('inquirer');
const child_process = require('child_process');
@ -103,19 +102,57 @@ function rightExists(string, find) {
const electronDir = path.resolve(__dirname, "public");
const nativeCachePath = path.resolve(__dirname, ".native");
const devloadCachePath = path.resolve(__dirname, ".devload");
const platform = ["build-mac", "build-mac-arm", "build-win"];
if (argv[2] === "--build") {
// 编译网站
function step1() {
if (fs.existsSync(electronDir)) {
deleteFile(electronDir);
}
fs.mkdirSync(electronDir);
copyFile(path.resolve(__dirname, "index.html"), electronDir + "/index.html")
//
child_process.spawnSync("mix", ["--production", "--", "--env", "--electron"], {stdio: "inherit"});
}
const platform = ["build-mac-intel", "build-mac-m1", "build-win"];
// 生成配置、编译应用
function step2(data) {
let systemInfo = `window.systemInformation = {
version: "${config.version}",
origin: "./",
apiUrl: "${formatUrl(data.url)}api/"
}`;
fs.writeFileSync(electronDir + "/config.js", systemInfo, 'utf8');
fs.writeFileSync(nativeCachePath, formatUrl(data.url));
fs.writeFileSync(devloadCachePath, "", 'utf8');
//
let packageFile = path.resolve(__dirname, "package.json");
let packageString = fs.readFileSync(packageFile, 'utf8');
packageString = packageString.replace(/"name":\s*"(.*?)"/, `"name": "${data.name}"`);
packageString = packageString.replace(/"appId":\s*"(.*?)"/, `"appId": "${data.id}"`);
packageString = packageString.replace(/"version":\s*"(.*?)"/, `"version": "${config.version}"`);
packageString = packageString.replace(/"artifactName":\s*"(.*?)"/g, '"artifactName": "' + getDomain(data.url) + '-${version}-${os}-${arch}.${ext}"');
fs.writeFileSync(packageFile, packageString, 'utf8');
//
child_process.spawnSync("npm", ["run", data.platform], {stdio: "inherit", cwd: "electron"});
}
// 还原配置
function step3() {
let packageFile = path.resolve(__dirname, "package.json");
let packageString = fs.readFileSync(packageFile, 'utf8');
packageString = packageString.replace(/"name":\s*"(.*?)"/, `"name": "${config.name}"`);
packageString = packageString.replace(/"appId":\s*"(.*?)"/, `"appId": "${config.app.id}"`);
packageString = packageString.replace(/"artifactName":\s*"(.*?)"/g, '"artifactName": "${productName}-${version}-${os}-${arch}.${ext}"');
fs.writeFileSync(packageFile, packageString, 'utf8');
}
if (["build", "prod"].includes(argv[2])) {
// 自定义编译
const questions = [
{
type: 'input',
name: 'targetUrl',
name: 'website',
message: "请输入网站地址",
default: () => {
if (fs.existsSync(nativeCachePath)) {
@ -135,10 +172,10 @@ if (argv[2] === "--build") {
name: 'platform',
message: "选择编译系统平台",
choices: [{
name: "MacOS Intel",
name: "MacOS",
value: [platform[0]]
}, {
name: "MacOS M1",
name: "MacOS arm64",
value: [platform[1]]
}, {
name: "Window x86_64",
@ -149,43 +186,30 @@ if (argv[2] === "--build") {
}]
}
];
inquirer.prompt(questions).then(answers => {
let data = `window.systemInformation = {
version: "${config.version}",
origin: "./",
apiUrl: "${formatUrl(answers.targetUrl)}api/"
}`;
fs.writeFileSync(nativeCachePath, formatUrl(answers.targetUrl));
fs.writeFileSync(electronDir + "/config.js", data, 'utf8');
//
fs.writeFileSync(devloadCachePath, "", 'utf8');
let packageFile = path.resolve(__dirname, "package.json");
let packageString = fs.readFileSync(packageFile, 'utf8');
packageString = packageString.replace(/"version":\s*"(.*?)"/, `"version": "${config.version}"`);
packageString = packageString.replace(/"name":\s*"(.*?)"/, `"name": "${config.name}"`);
fs.writeFileSync(packageFile, packageString, 'utf8');
//
child_process.spawnSync("mix", ["--production", "--", "--env", "--electron"], {stdio: "inherit"});
answers.platform.forEach(arg => {
child_process.spawnSync("npm", ["run", arg], {stdio: "inherit", cwd: "electron"});
let name = ""
if (arg == "build-mac-intel") {
name = config.name + "-" + config.version + ".dmg"
} else if (arg == "build-mac-m1") {
name = config.name + "-" + config.version + "-arm64.dmg"
} else if (arg == "build-win") {
name = config.name + " Setup " + config.version + ".exe"
}
if (name != "") {
fse.copySync(
path.resolve(__dirname, "dist", name),
path.resolve(__dirname, "build", getDomain(answers.targetUrl), config.version, name)
)
}
})
step1();
answers.platform.forEach(platform => {
step2({
"name": config.name,
"id": config.app.id,
"url": answers.website,
"platform": platform
})
});
step3();
});
} else if (platform.includes(argv[2])) {
// 自动编译
step1();
config.app.sites.forEach((data) => {
if (data.name && data.id && data.url) {
data.platform = argv[2];
step2(data)
}
})
step3();
} else {
// 开发模式
fs.writeFileSync(devloadCachePath, formatUrl("127.0.0.1:" + env.parsed.APP_PORT), 'utf8');
child_process.spawn("mix", ["watch", "--hot", "--", "--env", "--electron"], {stdio: "inherit"});
child_process.spawn("npm", ["run", "start-quiet"], {stdio: "inherit", cwd: "electron"});

View File

@ -1,6 +1,6 @@
{
"name": "DooTask",
"version": "0.3.99",
"version": "0.4.0",
"description": "DooTask is task management system.",
"main": "main.js",
"license": "MIT",
@ -8,13 +8,22 @@
"start": "electron-forge start",
"start-quiet": "sleep 3 && electron-forge start &> /dev/null",
"build": "electron-builder",
"build-mac-intel": "electron-builder --mac",
"build-mac-m1": "electron-builder --mac --arm64",
"build-mac": "electron-builder --mac",
"build-mac-arm": "electron-builder --mac --arm64",
"build-win": "electron-builder --win",
"package": "electron-forge package",
"make": "electron-forge make",
"publish": "electron-forge publish"
},
"author": {
"name": "KuaiFan",
"email": "aipaw@live.cn",
"url": "https://github.com/kuaifan"
},
"repository": {
"type": "git",
"url": "git+https://github.com/kuaifan/dootask.git"
},
"devDependencies": {
"@electron-forge/cli": "^6.0.0-beta.61",
"@electron-forge/maker-deb": "^6.0.0-beta.61",
@ -32,16 +41,27 @@
"xlsx": "^0.17.2"
},
"build": {
"appId": "com.dootask.task",
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
"files": [
"public",
"main.js",
"preload.js"
],
"mac": {
"icon": "../resources/assets/statics/public/images/logo-app.png"
"icon": "../resources/assets/statics/public/images/logo-app.png",
"target": "dmg",
"publish": ["github"]
},
"win": {
"icon": "../resources/assets/statics/public/images/logo-app.ico"
"icon": "../resources/assets/statics/public/images/logo-app.ico",
"target": ["tar.gz", "nsis"],
"publish": ["github"]
},
"nsis": {
"oneClick": false,
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
"allowToChangeInstallationDirectory": true
}
},
"config": {

View File

@ -1,12 +1,36 @@
{
"name": "DooTask",
"version": "0.3.99",
"version": "0.4.0",
"description": "DooTask is task management system.",
"scripts": {
"start": "./cmd dev",
"build": "./cmd prod",
"version": "node ./version.js"
},
"app": {
"id": "com.dootask.task",
"sites": [
{
"name": "DooTask",
"id": "com.dootask.task",
"url": "https://www.dootask.com/"
},
{
"name": "HitoseaTask",
"id": "com.hitosea.task",
"url": "https://t.hitosea.com/"
}
]
},
"author": {
"name": "KuaiFan",
"email": "aipaw@live.cn",
"url": "https://github.com/kuaifan"
},
"repository": {
"type": "git",
"url": "git+https://github.com/kuaifan/dootask.git"
},
"devDependencies": {
"axios": "^0.21",
"cross-env": "^7.0.2",

6
version.js vendored
View File

@ -2,6 +2,7 @@ const fs = require('fs');
const path = require("path");
const exec = require('child_process').exec;
const packageFile = path.resolve(process.cwd(), "package.json");
const packageElectronFile = path.resolve(process.cwd(), "electron/package.json");
function runExec(command, cb) {
exec(command, function (err, stdout, stderr) {
@ -26,7 +27,12 @@ runExec("git rev-list --all --count", function (err, response) {
return;
}
let ver = Math.floor(num / 10000) + "." + Math.floor(num / 100) + "." + Math.floor(num % 100)
//
let newResult = fs.readFileSync(packageFile, 'utf8').replace(/"version":\s*"(.*?)"/, `"version": "${ver}"`);
fs.writeFileSync(packageFile, newResult, 'utf8');
//
let newElectronResult = fs.readFileSync(packageElectronFile, 'utf8').replace(/"version":\s*"(.*?)"/, `"version": "${ver}"`);
fs.writeFileSync(packageElectronFile, newElectronResult, 'utf8');
//
console.log("new version: " + ver);
});