[Dart翻译]Dart中的自动更新网络服务

原文地址:felixblaschke.medium.com/auto-updati…

原文作者:felixblaschke.medium.com/

发布时间:2021年4月21日

最近我用Dart做了一些实验。我想有一个HTTP服务器,可以提供前端代码和一些简单的后端逻辑。一切都应该在一个虚拟的私人服务器(v-server)上运行。

线索是。我希望它能在我向Git仓库推送东西时自动更新/重新部署。而且它应该在没有任何复杂的CI管道的情况下完成工作。下面是我的结果。


我的方法是编写一个纯Dart应用程序。它创建了一个HTTP服务器。为此我使用了Alfred,因为它的使用非常简单,令人难以置信。

import 'dart:io';
import 'package:alfred/alfred.dart';

void main() async {
  var app = Alfred();

  app.get('*', (req, res) => Directory('public'));

  await app.listen(8080);
}
复制代码

这将启动一个由Dart驱动的HTTP服务,提供公共目录中的所有文件。

然后我利用了一个定时器,它将定期尝试git拉取一些东西。这在Dart中很容易做到。

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:alfred/alfred.dart';

void main() async {
  var app = Alfred();

  app.get('*', (req, res) => Directory('public'));

  await app.listen(8080);

  registerUpdater(onExit: () => app.close());
}

void registerUpdater({required void Function() onExit}) {
  Timer.periodic(Duration(seconds: 60), (timer) async {
    var process = await Process.start('git', ['pull']);
    var hasUpdated = false;
    await process.stdout.transform(utf8.decoder).forEach((line) {
      hasUpdated = line.startsWith('Updating') || hasUpdated;
    });
    await process.exitCode;

    if (hasUpdated) {
      print('Close app for update');
      onExit();
      timer.cancel();
    }
  });
}
复制代码

每当它检测到一个更新,它就会关闭应用程序。现在我们只需要一个机制来自动重新启动应用程序。在这一点上,Linux的systemd服务很方便。

[Unit]
Description=dartbackend

[Service]
User=root
Type=simple
ExecStart=/usr/bin/dart bin/dart_backend.dart
WorkingDirectory=/root/dart_backend
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
复制代码

它总是确保我的Dart后端在运行。(请记住,这个服务配置的例子并不完美,因为它使用了root用户。) 如果你想自己尝试一下。下面是要做的步骤。

  • 用Dart和Alfred(或任何其他软件包)编写你自己的HTTP服务,并使用上面的代码。提交并推送所有内容到Git仓库。
  • 如果你是v-server的新手,我建议使用Ubuntu或任何基于Debian的Linux发行版。这些都有大量的文档。
  • 在你的虚拟服务器上进行接下来的步骤。

确保安装好Git并授权给你的Git提供者账户

  • 安装Dart SDK
  • 在虚拟服务器上克隆你的git仓库
  • 配置你的systemd服务(教程
  • 祝你愉快 :-)

这只是一种方法。也许你知道其他的解决方案?欢迎在评论中发表。

下次再来吧

  • 菲利克斯-

www.deepl.com 翻译

猜你喜欢

转载自juejin.im/post/7018742727248445448