.NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟git
回归正题,你想盖大楼吗?想 GitHub 首页一片绿吗?今天拿她玩玩自动提交代码至 GitHub。github
dotnet new --install "Microsoft.DotNet.Web.ProjectTemplates.3.0" dotnet new worker
直接使用 .NET CLI 建立一个 Work Service 的项目shell
dotnet new worker -o AutomaticPush
用 Visual Studio 2019 打开项目能够看到如下代码json
// Program.cs public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); }
CreateHostBuilder
建立 Host 并在ConfigureServices
中调用.AddHostedService<Worker>()
// Worker.cs public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
Worker 继承了 BackgroundService,在 override ExecuteAsync 方法中完成自动提交的代码async
.NET 下操做 Git 须要用到一个库 LibGit2Sharp
,同时支持 .NET Framework 及 .NET Coreide
在项目中安装使用ui
Install-Package LibGit2Sharp
Repository.Init(@"D:\Work")
在指定路径建立一个新的 Git 仓库,至关于 git init
url
Repository.Clone("https://github.com/Meowv/Blog.git", @"D:\Work")
拉取一个远程仓库到本地,至关于 git clone
code
using (var repo = new Repository(@"D:\Blog")){}
打开本地存在的 Git 仓库orm
获取 Branch
using (var repo = new Repository(@"D:\Blog")) { var branches = repo.Branches; foreach (var item in branches) { } }
获取 Commits
using (var repo = new Repository(@"D:\Blog")) { foreach (var commit in repo.Commits) { } }
获取 Tags
using (var repo = new Repository(@"D:\Blog")) { foreach (var commit in repo.Tags) { } }
更多操做请移步 https://github.com/libgit2/libgit2sharp
有了以上基础,就能够实现自动生成文件,push 代码到 GitHub 了。
新建一个配置文件,存放咱们 GitHub 仓库以及帐号密码等重要信息
{ "repository": "本地git仓库绝对路径", "username": "GitHub帐号", "password": "GitHub密码", "name": "提交人", "email": "邮箱" }
在ExecuteAsync中读取配置文件信息
var configurationRoot = new ConfigurationBuilder().AddJsonFile("config.json").Build(); var path = configurationRoot["repository"]; var username = configurationRoot["username"]; var password = configurationRoot["password"]; var name = configurationRoot["name"]; var email = configurationRoot["email"];
git会自动检测文件变化,因此就先自动按日期建立.log文件,不断生成内容而后提交
while (!stoppingToken.IsCancellationRequested) { var fileName = $"{DateTime.Now.ToString("dd")}.log"; var content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); // 写入内容 WriteText(path, fileName, content); using (var repo = new Repository(path)) { // Stage the file Commands.Stage(repo, "*"); // Create the committer's signature and commit var author = new Signature(name, email, DateTime.Now); var committer = author; // Commit to the repository var commit = repo.Commit(content, author, committer); // git push var options = new PushOptions { CredentialsProvider = new CredentialsHandler((url, usernameFromUrl, types) => { return new UsernamePasswordCredentials() { Username = username, Password = password }; }) }; repo.Network.Push(repo.Branches["master"], options); } Console.WriteLine(content); // 等待60秒继续执行... await Task.Delay(60000, stoppingToken); } private static void WriteText(string path, string fileName, string content) { path = Path.Combine(path, DateTime.Now.ToString(@"yyyy\\MM")); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } var filePath = Path.Combine(path, fileName); using var fs = new FileStream(filePath, FileMode.Append); using var sw = new StreamWriter(fs); sw.WriteLine(content); }
至此,整个代码编写部分结束,项目发布后能够选择sc.exe注册为Windows服务,在这里推荐使用nssm(一个服务封装程序),好了,赶忙盖大楼去吧~~