FlubuCore 用C#写cmd/shell脚本

1.在解决方案下新建项目BuildScript

2.在BuildScript项目下新建BuildScript.cs文件

 3.Nuget安装FlubuCore包

 4.BuildScript.cs内容

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using FlubuCore.Context;
using FlubuCore.Context.Attributes.BuildProperties;
using FlubuCore.Context.FluentInterface.Interfaces;
using FlubuCore.IO;
using FlubuCore.Scripting;
using FlubuCore.Tasks;

namespace BuildScript
{
    public class BuildScript : DefaultBuildScript
    {
        /// <summary>
        /// 解决方案文件名
        /// </summary>
        [SolutionFileName]
        public string SolutionFileName { get; set; } = "Navy.sln";
        /// <summary>
        /// 构建配置
        /// </summary>
        [FromArg("c|configuration")]
        [BuildConfiguration]
        public string BuildConfiguration { get; set; } = "Release";
        /// <summary>
        /// Nuget推送地址
        /// </summary>
        [FromArg("nugetUrl")]
        public string NugetUrl { get; set; } = "http://xxx:xxx/v3/index.json";
        /// <summary>
        /// Nuget密钥
        /// </summary>
        [FromArg("nugetKey", "Nuget api key for publishing nuget packages.")]
        public string NugetApiKey { get; set; } = "xxxxxxxxxxxxxxxxxxxxxxxx";
        /// <summary>
        /// 输出目录
        /// </summary>
        public FullPath PublishDir => RootDirectory.CombineWith("../publish");
        /// <summary>
        /// 项目文件列表
        /// </summary>
        public List<FileFullPath>? Projects { get; set; }
        /// <summary>
        /// 忽略的项目
        /// </summary>
        public List<string> IgnoreProjects = new List<string> { "BuildScript", "Navy.ConsoleTest" };
        /// <summary>
        /// 默认打印的日志级别
        /// </summary>
        public LogLevel DefaultLogLevel { get; set; } = LogLevel.Error;
        /// <summary>
        /// 构建前操作
        /// </summary>
        /// <param name="context">构建任务上下文</param>
        protected override void BeforeBuildExecution(ITaskContext context)
        {
            Projects = context.GetFiles(RootDirectory, "*/*.csproj");
            Projects.RemoveAll(p => IgnoreProjects.Contains(Path.GetFileNameWithoutExtension(p.FileName)));
            Projects.ForEach((project) =>
            {
                Console.WriteLine(Path.GetFileNameWithoutExtension(project.FileName));
            });
        }

        /// <summary>
        /// 配置任务项
        /// </summary>
        /// <param name="context"></param>
        protected override void ConfigureTargets(ITaskContext context)
        {
            var clean = Clean(context);
            var restore = Restore(context);
            var build = Build(context, clean, restore);
            var pack = Pack(context, build);
            PublishNuGetPackage(context, pack);
        }

        /// <summary>
        /// 清理解决方案
        /// </summary>
        private ITarget Clean(ITaskContext context)
        {
            return context.CreateTarget("clean")
                .SetDescription("Clean the solution.")
                .AddCoreTask(t => t.Clean().WithLogLevel(DefaultLogLevel));
        }

        /// <summary>
        /// 还原包
        /// </summary>
        private ITarget Restore(ITaskContext context, params ITarget[] dependTargets)
        {
            return context.CreateTarget("restore")
                .SetDescription("Restore the solution.")
                .DependsOn(dependTargets)
                .AddCoreTask(t => t.Restore().WithLogLevel(DefaultLogLevel));
        }

        /// <summary>
        /// 编译解决方案
        /// </summary>
        private ITarget Build(ITaskContext context, params ITarget[] dependTargets)
        {
            return context.CreateTarget("compile")
                .SetDescription("Compiles the solution.")
                .DependsOn(dependTargets)
                .AddCoreTask(t => t.Build().WithLogLevel(DefaultLogLevel));
        }

        /// <summary>
        /// 创建nuget包
        /// </summary>
        private ITarget Pack(ITaskContext context, params ITarget[] dependTargets)
        {
            return context.CreateTarget("pack")
                .SetDescription("Create nuget packages.")
                .DependsOn(dependTargets)
                .AddTask(x => x.DeleteDirectoryTask(PublishDir, false)) //删除发布目录
                .ForEach(Projects, (project, target) =>
                {
                    target.AddCoreTask(t => t.Pack()
                        .WithLogLevel(DefaultLogLevel)
                        .Project(project)
                        .OutputDirectory(PublishDir));
                });
        }

        /// <summary>
        /// 发布nuget包
        /// </summary>
        private void PublishNuGetPackage(ITaskContext context, params ITarget[] dependTargets)
        {
            context.CreateTarget("nuget.publish")
                .SetDescription("Publishes nuget packages")
                .DependsOn(dependTargets)
                .Do(t =>
                {
                    var packages = Directory.GetFiles(PublishDir, "*.nupkg");
                    foreach (var package in packages)
                    {
                        if (package.EndsWith("symbols.nupkg", StringComparison.OrdinalIgnoreCase))
                            continue;
                        context.CoreTasks().NugetPush(package)
                            .DoNotFailOnError(ex => { Console.WriteLine($"Failed to publish {package}.exception: {ex.Message}"); })
                            .ServerUrl(NugetUrl)
                            .ApiKey(NugetApiKey)
                            .Execute(context);
                    }
                });
        }
    }
}

5.安装全局命令行工具

dotnet tool install --global FlubuCore.GlobalTool

6.在根目录打开PowerShell执行

flubu nuget.publish

运行结果如下:

 

posted @ 2024-02-05 18:10  NavyW  阅读(52)  评论(0编辑  收藏  举报