اجرای یک برنامه فینچ
یک برنامه فینچ به دو فایل نیاز دارد: app.dart (تنظیمات برنامه) و یک نقطه ورود — معمولاً bin/main.dart برای production یا lib/serve.dart برای توسعه با نظارت بر فایل.
app.dart — تنظیمات برنامه
app.dart نمونه FinchApp را میسازد، مسیرها را ثبت میکند، و main() را تعریف میکند. این ساختار استاندارد بر اساس پروژه مثال فینچ است:
// lib/app.dart
import 'package:finch/finch_app.dart';
import 'package:finch/finch_tools.dart';
import 'package:finch/finch_route.dart';
import 'package:finch/finch_console.dart';
import 'route/web_route.dart';
FinchConfigs configs = FinchConfigs(
port: (env['DOMAIN_PORT'] ?? '8080').toInt(def: 8080),
domain: env['DOMAIN'] ?? 'localhost',
publicDir: pathTo(env['PUBLIC_DIR'] ?? './public'),
widgetsPath: pathTo(env['WIDGETS_PATH'] ?? './lib/widgets'),
widgetsType: env['WIDGETS_TYPE'] ?? 'j2.html',
languagePath: pathTo(env['LANGUAGE_PATH'] ?? './lib/languages'),
enableLocalDebugger: (env['ENABLE_LOCAL_DEBUGGER'] ?? false).toString().toBool,
);
final app = FinchApp(configs: configs);
void main([List<String>? args]) async {
app.addRouting(getWebRoute);
app.start(args).then((value) {
Console.p('Server started: http://localhost:${value.port}');
});
}
تابع مسیر
مسیرها در تابعی تعریف میشوند که یک Request دریافت کرده و Future<List<FinchRoute>> برمیگرداند:
// lib/route/web_route.dart
import 'package:finch/finch_route.dart';
import '../controllers/home_controller.dart';
final homeController = HomeController();
Future<List<FinchRoute>> getWebRoute(Request rq) async {
return [
FinchRoute(
key: 'root',
path: '/',
methods: Methods.ONLY_GET,
index: homeController.index,
),
FinchRoute(
key: 'root.api',
path: 'api/hello',
methods: Methods.ONLY_GET,
index: homeController.hello,
),
];
}
مسیرهای Inline (میانبر)
برای مسیرهای ساده یا سریع، FinchApp متدهای میانبر دارد. callback ی که index دریافت میکند Request را به عنوان پارامتر میگیرد:
app
..get(
path: '/ping',
index: (rq) async => rq.renderString(text: 'pong'),
)
..post(
path: '/echo',
index: (rq) async {
var body = rq.get<String>('message', def: '');
return rq.renderString(text: body);
},
)
..postGet(
path: '/form',
index: (rq) async => rq.renderString(text: 'GET or POST'),
);
توسعه: serve.dart با نظارت بر فایل
در طول توسعه، از lib/serve.dart استفاده کنید. این فایل main() از app.dart را اجرا کرده و فایلهای widget و زبان را برای تغییرات رصد میکند و بدون راهاندازی مجدد کامل سرور، source map های دارت را مجدداً تولید میکند:
finch serve -p lib/serve.dart
# یا
dart run lib/serve.dart
Production: کامپایل به باینری
برای کامپایل به یک باینری native مستقل:
finch build -a lib/app.dart -o ./build/app
./build/app
یا از Dockerfile / docker-compose ارائهشده استفاده کنید. به Docker مراجعه کنید.
Cron Jobs
وظایف زمانبندیشده را با app.registerCron() ثبت کنید:
app.registerCron(
FinchCron(
schedule: FinchCron.evryDay(2), // هر ۲ روز
onCron: (index, cron) async {
// اجرای وظیفه پاکسازی
},
delayFirstMoment: true,
).start(),
);
// عبارت cron استاندارد
app.registerCron(
FinchCron(
schedule: '0 * * * *', // هر ساعت
onCron: (index, cron) async {
// اجرای وظیفه ساعتی
},
).start(),
);
ارسال آرگومانها
همیشه args از main را به app.start() منتقل کنید. این امکان دستوراتی مانند migrate و دستورات سفارشی را فراهم میکند:
void main([List<String>? args]) async {
app.addRouting(getWebRoute);
app.start(args);
}
dart run lib/app.dart migrate --init