Commit 7a63ecf0 authored by 罗显健's avatar 罗显健

【编号:21348】项目打包升级

parent 44ef276f
This diff is collapsed.
......@@ -34,11 +34,8 @@ namespace Ftt.PatchPack
{
InitForm();
}
private void InitForm()
{
LogVisible(false);
projects = ProjectHelp.Read();
if (projects == null) projects = new Dictionary<string, Project>();
foreach (var cli in projects)
......@@ -79,8 +76,7 @@ namespace Ftt.PatchPack
}
#endregion
#region 按钮操作
#region 【项目】添加、复制、修改、删除
private void btnAdd_Click(object sender, EventArgs e)
{
Project project = new Project();
......@@ -92,6 +88,28 @@ namespace Ftt.PatchPack
}
}
}
private void btnCopy_Click(object sender, EventArgs e)
{
if (lstProject.SelectedItems.Count == 0)
{
MessageBox.Show("请选择需要复制的项目");
return;
}
if (!projects.TryGetValue(lstProject.SelectedItems[0].Text, out Project project))
{
MessageBox.Show("复制项目失败!");
return;
}
var newProject = project.Copy();
using (FrmProject frmProject = new FrmProject(projects, ref newProject))
{
if (frmProject.ShowDialog() == DialogResult.Yes)
{
lstProject.Items.Add(newProject.Name);
}
}
}
private void btnEdit_Click(object sender, EventArgs e)
{
......@@ -113,9 +131,12 @@ namespace Ftt.PatchPack
private void btnDel_Click(object sender, EventArgs e)
{
var items = lstProject.CheckedItems;
if (items.Count == 0) return;
if (MessageBox.Show("确定要删除选择的项目?", "", MessageBoxButtons.YesNo) != DialogResult.Yes) return;
if (items.Count == 0)
{
MessageBox.Show("请选择需要删除的项目!");
return;
}
if (MessageBox.Show($"是否确定要删除勾选的 {items.Count} 个项目?", "询问", MessageBoxButtons.YesNo) != DialogResult.Yes) return;
for (int index = items.Count - 1; index >= 0; index--)
{
......@@ -130,7 +151,9 @@ namespace Ftt.PatchPack
ProjectHelp.Save(projects); // 删除后,需要保存
}
#endregion
#region 按钮操作
private void btnPatch_Click(object sender, EventArgs e)
{
var items = lstProject.CheckedItems;
......@@ -153,10 +176,11 @@ namespace Ftt.PatchPack
item.BackColor = System.Drawing.Color.White;
}
tabControl1.SelectTab(tabPageLog); //打包的时候,切换到日志页签
int success = 0;
Cursor.Current = Cursors.WaitCursor;
Project.MergeSqlFile = ckbMergeSql.Checked;
InitProjectPackCfg();
foreach (ListViewItem item in items)
{
if (projects.TryGetValue(item.Text, out Project project) && project != null)
......@@ -181,7 +205,7 @@ namespace Ftt.PatchPack
}
finally
{
ProjectHelp.DeleteDirectoryIfExists(project.MergeSqlTempFullPath);
ProjectHelp.DeleteDirectoryIfExists(project.MergeSqlTempFullPath);//删除合并脚本的临时目录
Application.DoEvents();
}
}
......@@ -189,7 +213,6 @@ namespace Ftt.PatchPack
Cursor.Current = Cursors.Default;
int fail = totalCount - success;
if (fail > 0) ckbShowLog.Checked = true;
string strFail = fail == 0 ? "" : $",失败{fail}个";
MessageBox.Show($"打包项目{totalCount}个,成功{success}个 {strFail}。");
......@@ -208,36 +231,19 @@ namespace Ftt.PatchPack
System.Diagnostics.Process.Start(PackageFileDirectory);
}
/// <summary>
/// 显示日志
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ckbShowLog_CheckedChanged(object sender, EventArgs e)
private void ckbPackTemplate_CheckedChanged(object sender, EventArgs e)
{
LogVisible(ckbShowLog.Checked);
}
#endregion
#region 内部方法
private void LogVisible(bool visible)
if (ckbPackTemplate.Checked)
{
if (this.InvokeRequired)
if (MessageBox.Show("Template模版文件一般由项目组自己维护,是否确定打包?", "警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)
{
this.BeginInvoke(new Action<bool>(LogVisible), visible);
ckbPackTemplate.Checked = false;
}
else
{
if (visible)
this.Width += gpbLog.Width;
else
this.Width -= gpbLog.Width;
gpbLog.Visible = visible;
}
}
#endregion
#region 内部方法
/// <summary>
/// 写日志
/// </summary>
......@@ -253,6 +259,15 @@ namespace Ftt.PatchPack
txtLog.AppendText(content + "\r\n");
}
}
/// <summary>
/// 初始化项目打包配置
/// </summary>
private void InitProjectPackCfg()
{
Project.MergeSqlFile = ckbMergeSql.Checked;
Project.PackTemplate = ckbPackTemplate.Checked;
}
#endregion
}
}
......@@ -120,47 +120,33 @@ namespace Ftt.PatchPack
project.RelativeAppFilePath = txtRelativeAppFilePath.Text.Trim();
project.ExeName = this.txtExeName.Text.Trim();
project.RelativeDbFilePath = txtRelativeDbFilePath.Text.Trim();
if (project.Name == null)// 新增
{
project.Name = txtProjectName.Text.Trim();
if (this.dictionary.ContainsKey(project.Name))
{
if (MessageBox.Show(null, "已存在,是否替换", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
if (dictionary[project.Name] != project //如果是同一个对象,则不需要提示
&& MessageBox.Show(null, $"项目【{project.Name}】已存在,是否替换?", "提示", MessageBoxButtons.YesNo) != DialogResult.Yes)
return;
dictionary[project.Name] = project;
else return;
this.DialogResult = DialogResult.No; //替换项目无需添加,返回No
}
else
{
dictionary.Add(project.Name, project);
base.DialogResult = DialogResult.Yes; //需要添加到列表,返回Yes
}
}
else
{
// 移除原始的,再添加新的
dictionary.Remove(this.project.Name);
project.Name = txtProjectName.Text.Trim();
dictionary.Add(project.Name, project);
}
ProjectHelp.Save(dictionary);
MessageBox.Show("保存成功!");
base.DialogResult = DialogResult.Yes;
this.Close();
}
catch (Exception exception)
{
base.DialogResult = DialogResult.None;
MessageBox.Show(exception.ToString());
}
}
private void btnCancle_Click(object sender, EventArgs e)
......
......@@ -12,6 +12,18 @@ namespace Ftt.PatchPack
{
public class Project
{
#region 静态属性
/// <summary>
/// 是否合并sql文件,默认:否.
/// </summary>
public static bool MergeSqlFile = false;
/// <summary>
/// 是否打包模板文件,默认:否。
/// </summary>
public static bool PackTemplate = false;
#endregion
#region 属性定义
/// <summary>
......@@ -53,10 +65,6 @@ namespace Ftt.PatchPack
/// </summary>
public string RelativeDbFilePath { get; set; } = @"开发文档\数据库脚本";
/// <summary>
/// 是否合并sql文件.
/// </summary>
public static bool MergeSqlFile = false;
/// <summary>
/// 合并Sql文件的临时目录,在<see cref="RelativeDbFilePath"/>目录下。
......@@ -68,10 +76,16 @@ namespace Ftt.PatchPack
/// </summary>
static string MergeSqlRelativePath = "MergeTemp";
/// <summary>
/// 永久有效的年份标记:2099
/// <para>该年份文件夹内的文件、在有效期内的需要打包</para>
/// </summary>
static int ForeverValidYear = 2099;
#endregion
/// <summary>
/// 额外打包的文件(存在且更更新时间符合Dll的更新时间)。比如:更新 2021-11-26 17:30:39 lxj
/// 额外打包的文件(存在且更新时间符合Dll的更新时间)。比如:更新 2021-11-26 17:30:39 lxj
/// </summary>
static List<string> ContainFiles = new List<string> { "Notice.xml" };
static List<string> ExceptFiles = new List<string> { "U.Memopad.dll" };
......@@ -173,7 +187,12 @@ namespace Ftt.PatchPack
valid.AddRange(GetValidPatchFile(imgPath, "*.*", SearchOption.TopDirectoryOnly, imgPath, $"{ExeName}\\Image", PatchTimeFrame_Xml));
}
//当需要打包模板文件时,打包Template目录下的所有文件(时间范围同xml)
var templatePath = Path.Combine(AbsoluteRootDirectory, RelativeAppFilePath, "Template");
if (PackTemplate && System.IO.Directory.Exists(templatePath))
{
valid.AddRange(GetValidPatchFile(templatePath, "*.*", SearchOption.TopDirectoryOnly, templatePath, $"{ExeName}\\Template", PatchTimeFrame_Xml));
}
#endregion
......@@ -208,7 +227,10 @@ namespace Ftt.PatchPack
foreach (var dire in dires)
{
valid.AddRange(GetValidPatchFile(dire.FullName, "*.sql", SearchOption.AllDirectories, path, "DB", -1)); // 脚本文件夹里的文件永久有效。
// 2099-xx-xx文件内的脚本需要取有效期内的。其他日期的文件夹为增量脚本已通过校验,需要取所有。
var hours = ParseToDateTime(dire.Name).Year == ForeverValidYear ? PatchTimeFrame_Sql : -1;
valid.AddRange(GetValidPatchFile(dire.FullName, "*.sql", SearchOption.AllDirectories, path, "DB", hours)); // 脚本文件夹里的文件永久有效。
}
}
......@@ -254,6 +276,23 @@ namespace Ftt.PatchPack
Int32.TryParse(ConfigurationManager.AppSettings["PatchTimeFrame_Xml"], out PatchTimeFrame_Xml);
}
/// <summary>
/// 复制项目
/// </summary>
/// <returns></returns>
public Project Copy()
{
return new Project
{
Name = "请输入新项目名称",
ExeName = this.ExeName,
AbsoluteRootDirectory = this.AbsoluteRootDirectory,
RelativeAppFilePath = this.RelativeAppFilePath,
RelativeDbFilePath = this.RelativeDbFilePath,
MergeSqlTempFullPath = this.MergeSqlTempFullPath
};
}
#endregion
#region 私有方法
......@@ -276,9 +315,7 @@ namespace Ftt.PatchPack
{
DirectoryInfo directoryInfo = new DirectoryInfo(dir);
var dtFile = ParseToDateTime(directoryInfo.Name); // 文件夹的命名规则,必须是日期格式
if (!IsValid(dtFile, hours)) continue;
if (!IsValidDBScriptFolderName(directoryInfo.Name, hours)) continue; // 文件夹的命名规则,必须是日期格式
validPath.Add(directoryInfo);
}
......@@ -305,8 +342,15 @@ namespace Ftt.PatchPack
FileInfo destMergeFile = null;//合并文件锚点
foreach (var sourceFile in sqlFiles)
{
//2099-xx-xx 的文件夹内,还有子文件夹。层级比其他日期的要多一层,合并时用到的临时目录也需要多一层。
if (sourceFile.RelativePatchPath.StartsWith("DB\\2099"))
{
var subPath = Path.Combine(MergeSqlTempFullPath, sourceFile.RelativePatchPath);
if (!Directory.Exists(subPath)) Directory.CreateDirectory(subPath); //创建所有层级的子目录,打包结束会被删除
}
var tmpFile = Path.Combine(MergeSqlTempFullPath, $"{sourceFile.RelativePatchPath}_{sourceFile.Name}");
File.Copy(sourceFile.FullName, tmpFile, true);
File.Copy(sourceFile.FullName, tmpFile, true); //把待合并的sql文件复制到临时目录。
if (ProjectHelp.CanMergeSqlFile(tmpFile))
{
......@@ -428,6 +472,18 @@ namespace Ftt.PatchPack
return date;
}
/// <summary>
/// 校验脚本文件夹名称是否合法
/// </summary>
/// <param name="folderName">文件夹名称(日期格式)</param>
/// <param name="hours">打包期限,单位小时</param>
/// <returns></returns>
private bool IsValidDBScriptFolderName(string folderName, double hours)
{
DateTime date = ParseToDateTime(folderName);
return IsValid(date, hours);
}
#endregion
}
......@@ -447,6 +503,8 @@ namespace Ftt.PatchPack
fileName = @"config\project.json";
if (File.Exists(oldPath))
{
if (!Directory.Exists(Application.StartupPath))
Directory.CreateDirectory(Application.StartupPath);
File.Copy(oldPath, FilePath, true);
File.Delete(oldPath);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment