<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基于DotNetty實現自動發布 - 自動檢測代碼變化

      前言

      很抱歉沒有實現上一篇的目標:一鍵發布,因為工作量超出了預期,本次只實現了 Git 代碼變化檢測

      已完成的功能

      • 解決方案的項目發現與配置
      • 首次發布需要手動處理
      • 自動檢測代碼變化并解析出待發布的文件

      image
      image
      image

      簡要說明

      • 只需要填寫解決方案的 Git 倉儲路徑即可自動發現項目 (通過查找 .csproj 文件實現)

      • 自動發現 Web 項目 (通過判斷項目根目錄是否包含 Web.config 實現) PS: 只支持 .NET Framework

      • 需要配置 Web 項目的發布目錄, 編譯還需要手動執行

      • 首次發布需要手動執行, 然后保存此次發布對應的 Git 提交 ID

      • 后續發布,可以根據上次發布記錄,自動解析出待待發布的文件

      部分代碼

      發現解決方案

      private static Solution DetectSolution(string gitRepoPath)
      {
          string[] solutionFilePaths = Directory.GetFiles(gitRepoPath, "*.sln", SearchOption.AllDirectories);
          if (solutionFilePaths == null || solutionFilePaths.Length == 0)
          {
              throw new Exception("未找到解決方案");
          }
          string[] projectFilePaths = Directory.GetFiles(gitRepoPath, "*.csproj", SearchOption.AllDirectories);
          if (projectFilePaths == null || projectFilePaths.Length == 0)
          {
              throw new Exception("未找到項目");
          }
      
          var solutionFilePath = solutionFilePaths[0];
          var solutionDir = Path.GetDirectoryName(solutionFilePath);
          var solutionName = Path.GetFileNameWithoutExtension(solutionFilePath);
      
          var solution = new Solution
          {
              GitRepositoryPath = gitRepoPath,
              SolutionDir = solutionDir!,
              SolutionName = solutionName
          };
      
          foreach (var projectFilePath in projectFilePaths)
          {
              var projectDir = Path.GetDirectoryName(projectFilePath);
              var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
              var webConfigFiles = Directory.GetFiles(projectDir!, "web.config", SearchOption.TopDirectoryOnly);
              var project = new Project
              {
                  ProjectDir = projectDir!,
                  ProjectName = projectName,
                  IsWeb = webConfigFiles != null && webConfigFiles.Length > 0,
                  SolutionName = solutionName,
                  ReleaseDir = string.Empty
              };
              solution.Projects.Add(project);
          }
          return solution;
      }
      

      獲取自上次發布以來的改動

      public static List<PatchEntryChanges> GetChangesSinceLastPublish(string repoPath, string? lastCommitId = null)
      {
          var repo = GetRepo(repoPath);
      
          //獲取上次發布的提交
          Commit? lastCommit = null;
          if (!string.IsNullOrEmpty(lastCommitId))
          {
              lastCommit = repo.Lookup<Commit>(lastCommitId);
              if (lastCommit == null)
              {
                  throw new Exception("無法獲取上次發布的提交記錄");
              }
          }
      
          //獲取自上次提交以來的改動
          var diff = repo.Diff.Compare<Patch>(lastCommit?.Tree, DiffTargets.Index);
          return [.. diff];
      }
      

      從 Git 修改記錄提取出待發布文件

      private List<DeployFileInfo> GetPublishFiles(IEnumerable<string> changedFilePaths)
      {
          var fileInfos = new List<DeployFileInfo>(changedFilePaths.Count());
          foreach (string changedPath in changedFilePaths)
          {
              var fi = DeployFileInfo.Create(changedPath);
              if (fi.IsUnKnown) continue;
              fileInfos.Add(fi);
          }
          foreach (var fi in fileInfos)
          {
              fi.ChangedFileAbsolutePath = Path.Combine(GitRepositoryPath, fi.ChangedFileRelativePath);
      
              //所屬項目
              var project = Projects
                  .Where(a => fi.ChangedFileRelativePath.Contains(a.ProjectName, StringComparison.OrdinalIgnoreCase))
                  .FirstOrDefault();
              if (project == null) continue;
      
              fi.ProjectName = project.ProjectName;
              if (fi.IsDLL)
              {
                  fi.FileName = $"{project.ProjectName}.dll";
                  fi.PublishFileRelativePath = $"bin\\{fi.FileName}";
              }
              else
              {
                  fi.PublishFileRelativePath = fi.ChangedFileAbsolutePath.Replace(project.ProjectDir, "").TrimStart(Path.DirectorySeparatorChar);
              }
              fi.PublishFileAbsolutePath = Path.Combine(webProject!.ReleaseDir, fi.PublishFileRelativePath);
      
              //Logger.Info(fi.ToJsonString(true));
          }
          //按照 PublishFileAbsolutePath 去重
          return fileInfos.Distinct(new DeployFileInfoComparer()).ToList();
      }
      

      設置項目發布路徑

      private async Task OkSetProjectReleaseDir()
      {
          if (string.IsNullOrEmpty(ReleaseDir) || !Directory.Exists(ReleaseDir))
          {
              Growl.ClearGlobal();
              Growl.ErrorGlobal("請正確設置項目發布路徑");
              return;
          }
      
          var solutionRepo = Program.AppHost.Services.GetRequiredService<SolutionRepository>();
          await solutionRepo.UpdateProjectReleaseDir(Id, ReleaseDir);
      
          setProjectReleaseDirDialog?.Close();
      
          Growl.SuccessGlobal("操作成功");
      }
      

      總結

      本篇主要實現了 Git 代碼變化的自動檢測

      代碼倉庫

      項目暫且就叫 OpenDeploy

      歡迎大家拍磚,Star

      下一步

      計劃下一步,實現一鍵發布,把待發布的文件一次性打包通過 DotNetty 發送到服務器

      posted @ 2023-12-08 11:55  Broadm  閱讀(602)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 中文字幕久久国产精品| 无码伊人66久久大杳蕉网站谷歌| 无人区码一码二码三码区| 激情人妻自拍中文夜夜嗨| 国产高清一区二区不卡| 欧美xxxx做受欧美.88| √新版天堂资源在线资源| 欧美性猛交xxxx乱大交丰满| 国产私拍大尺度在线视频 | 国产69精品久久久久乱码免费| 国产在线欧美日韩精品一区| 亚洲中文字幕av无码区| 内射一区二区三区四区| 午夜福利院一区二区三区| 2020久久国产综合精品swag| 日韩中文字幕精品人妻| 男人的天堂av一二三区| 中文字幕无码免费久久| 国产不卡在线一区二区| 日本夜爽爽一区二区三区| 国产精品免费看久久久| 看黄a大片日本真人视频直播| 精品国产成人一区二区| 亚洲精品综合久中文字幕| 亚洲国产精品无码久久电影| 97久久精品人人做人人爽| 国产黄色带三级在线观看| 强奷乱码中文字幕| 平谷区| 韩国美女福利视频一区二区| 成人网站免费观看永久视频下载| 欲色欲色天天天www| 亚洲a免费| 国模精品视频一区二区三区 | 少妇激情一区二区三区视频小说| 亚洲av乱码一区二区| 全球成人中文在线| 成人精品视频一区二区三区| 亚洲一区二区三区黄色片| 97人妻免费碰视频碰免| 又爽又黄又无遮掩的免费视频|