forked from NewLifeX/XCoder
-
Notifications
You must be signed in to change notification settings - Fork 1
/
XCoder.tt
139 lines (117 loc) · 5.38 KB
/
XCoder.tt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<#@ 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 company = "NewLife";
var name = "Common";
var dir = "$(实体分类)";
// 自动寻找模型文件,并从中获取公司名和链接名
var mdl = GetModelFile(ref company, ref name);
if(!File.Exists(mdl)) throw new Exception("未找到模型文件!");
dir = "Entity";
// 取得模版所在目录
var mypath = Path.GetDirectoryName(Host.TemplateFile) + "\\";
//if(mdl == null) mdl = mypath + company + "." + name + ".xml"; // 数据模型文件
// 计算数据模型工具XCoder位置
var xpath = GetXPath(mypath);
var exe = xpath + "XCoder.exe";
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"] = company + "." + name + ".Entity";// 命名空间
dic["EntityConnName"] = name; // 连接名
dic["BaseClass"] = "Entity"; // 实体基类
dic["RenderGenEntity"] = false; // 生成泛型实体类
dic["Override"] = true; // 是否覆盖目标文件
dic["UseCNFileName"] = true; // 中文文件名
dic["UseHeadTemplate"] = true; // 使用.cs文件头模版
// 文件头模版
dic["HeadTemplate"] = "/*\r\n * XCoder v\<#=Version\#>\r\n * 作者:\<#=Environment.UserName + \"/\" + Environment.MachineName\#>\r\n * 时间:\<#=DateTime.Now.ToString(\"yyyy-MM-dd HH:mm:ss\")\#>\r\n * 版权:版权所有 (C) 新生命开发团队 2002~\<#=DateTime.Now.ToString(\"yyyy\")\#>\r\n*/\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 + "\\" + dir; // 输出目录
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\\" + name + "\\$(页面分类)"; // 输出目录
dic["UseCNFileName"] = false; // 中文文件名
dic["TemplateName"] = "[内置]页面"; // 模版名
//Save(cfg, dic);
//WriteLine("生成:" + dic["TemplateName"]);
//Process.Start(exe, arg).WaitForExit(3000);
#>
<#+
String GetXPath(String mypath)
{
var xpath = @"{XCoderPath}";
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 = @"C:\X\XCoder\";
if(!File.Exists(xpath + "XCoder.exe")) xpath = @"C:\X\代码生成\";
if(!File.Exists(xpath + "XCoder.exe")) xpath = @"D:\X\XCoder\";
if(!File.Exists(xpath + "XCoder.exe")) xpath = @"E:\X\XCoder\";
if(!File.Exists(xpath + "XCoder.exe")) xpath = @"F:\X\XCoder\";
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("ModelConfig");
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);
}
// 获取模型文件
String GetModelFile(ref String company, ref String name)
{
// 取得模版所在目录
var mypath = Path.GetDirectoryName(Host.TemplateFile) + "\\";
foreach(var item in Directory.GetFiles(mypath, "*.xml"))
{
name = Path.GetFileNameWithoutExtension(item);
var p = name.LastIndexOf(".");
if(p<0) continue;
company = name.Substring(0, p);
name = name.Substring(p+1);
return Path.GetFullPath(item);
}
return null;
}
#>