[fix]Config创建默认配置文件的开关Runtime.CreateConfigOnMissing,仅需对自动创建生效,而不应该阻止用户主动Save
智能大石头 authored at 2024-08-09 00:30:41 石头 committed at 2024-08-10 14:22:24
4.96 KiB
X
<#@ template language="C#" hostSpecific="true" debug="true" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ output extension=".log" #>
<#
	// 尽管T4模版可以直接调用XCoder内部类库进行代码生成,但是那会导致XCoder文件被锁定,所以采用启动进程来生成的方式!

	var name = "Common";
	
	// 取得模版所在目录
	var mypath = Path.GetDirectoryName(Host.TemplateFile) + "\\";
	var mdl = mypath + name + ".xml";	// 数据模型文件

	// 计算数据模型工具XCoder位置
	var xpath = GetXPath(mypath);
	
	var exe = xpath + "XCoder.exe";
	
	// 如果数据模型文件不存在,则先导出一份
	if(!File.Exists(mdl))
	{
		var connstr = String.Format("Data Source=.;Initial Catalog={0};Integrated Security=SSPI", name);
		var provider = "MSSQL";
		var ps = String.Format("-MakeModel -model \"{0}\" -ConnStr \"{1}\" -Provider {2}", mdl, connstr, provider);
		Process.Start(exe, ps).WaitForExit(10000);

		if(!File.Exists(mdl)) throw new Exception("无法导出数据模型,请检查连接字符串!");
	}
	
	var cfg = mypath + "set.config";
	var arg = String.Format("-Render -model \"{0}\" -config \"{1}\" -Log \"{2}\"", mdl, cfg, mypath + "XCoder2.log");
	WriteLine("路径:" + exe);
	WriteLine("参数:" + arg);

	var dic = new Dictionary<String, Object>();
	dic["NameSpace"] = "NewLife." + name + "Entity";// 命名空间
	dic["EntityConnName"] = name;	// 连接名
	
	dic["BaseClass"] = "Entity";	// 实体基类
	dic["RenderGenEntity"] = true;	// 生成泛型实体类
	dic["Override"] = true;			// 是否覆盖目标文件
	dic["UseCNFileName"] = true;	// 中文文件名
	dic["UseHeadTemplate"] = true;	// 使用.cs文件头模版
	// 文件头模版
	dic["HeadTemplate"] = "/*\r\n * XCoder v&lt;#=Version#&gt;\r\n * 作者:&lt;#=Environment.UserName + \"/\" + Environment.MachineName#&gt;\r\n * 时间:&lt;#=DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\")#&gt;\r\n * 版权:版权所有 (C) 新生命开发团队 &lt;#=DateTime.Now.ToString(\"yyyy\")#&gt;\r\n*/";

	dic["OutputPath"] = mypath;					// 输出目录
	dic["TemplateName"] = "[内置]数据字典";		// 模版名
	Save(cfg, dic);
	WriteLine("生成:" + dic["TemplateName"]);
	Process.Start(exe, arg).WaitForExit(3000);

	dic["Override"] = false;					// 是否覆盖目标文件
	dic["OutputPath"] = mypath + "\\$(实体分类)";	// 输出目录
	dic["TemplateName"] = "[内置]实体业务";		// 模版名
	Save(cfg, dic);
	WriteLine("生成:" + dic["TemplateName"]);
	//Process.Start(exe, arg).WaitForExit(3000);

	dic["Override"] = true;					// 是否覆盖目标文件
	dic["UseHeadTemplate"] = false;	// 使用.cs文件头模版。实体业务一次生产的,可以要头部,实体数据要头部会导致每次生产都改变文件
	dic["TemplateName"] = "[内置]实体数据";		// 模版名
	Save(cfg, dic);
	WriteLine("生成:" + dic["TemplateName"]);
	Process.Start(exe, arg).WaitForExit(3000);

	dic["Override"] = false;					// 是否覆盖目标文件
	dic["OutputPath"] = mypath + "..\\..\\Web\\Admin\\Sys";	// 输出目录
	dic["UseCNFileName"] = false;				// 中文文件名
	dic["TemplateName"] = "[内置]页面";			// 模版名
	//Save(cfg, dic);
	//WriteLine("生成:" + dic["TemplateName"]);
	//Process.Start(exe, arg).WaitForExit(3000);
	
	WriteLine("已完成!" + DateTime.Now);
#>
<#+
	String GetXPath(String mypath)
	{
		var xpath = @"C:\X\XCoder\";
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"..\XCoder\");
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"..\代码生成\");
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"..\..\XCoder\");
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"..\..\代码生成\");
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"C:\X\XCoder\");
		if(!File.Exists(xpath + "XCoder.exe")) xpath = Path.Combine(mypath, @"C:\X\代码生成\");
		if(!File.Exists(xpath + "XCoder.exe")) throw new Exception("无法定位数据模型工具XCoder的位置!");
		xpath = Path.GetFullPath(xpath);
		
		return xpath;
	}

	// 保存字典到Xml文件,其实是变相序列化
	void Save(String file, Dictionary<String, Object> data)
	{
		var doc = new XmlDocument();
		var root = doc.CreateElement("XConfig");
		doc.AppendChild(root);

		if (data != null && data.Count > 0)
		{
			foreach (var item in data)
			{
				var elm = doc.CreateElement(item.Key);
				if (item.Value != null && item.Value.GetType() == typeof(Boolean))
					elm.InnerText = item.Value.ToString().ToLower();
				else
					elm.InnerText = item.Value + "";
				root.AppendChild(elm);
			}
		}
		
		File.WriteAllText(file, doc.OuterXml);
	}
#>