U9_Git中ignore文件处理
背景
U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak
文件 Enum.cs结尾的文件,还有许多 extand文件。 这些文件都不需要上传Git。
但是这些文件太多了,不可能手动加入到ignore文件中。就需要一个工具,自动生成ignore文件。
了解ignore文件的忽略规则
在.gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:
.gitignore忽略规则的优先级
在 .gitignore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
1)从命令行中读取可用的忽略规则
2)当前目录定义的规则
3)父级目录定义的规则,依次递推
4)$GIT_DIR/info/exclude 文件中定义的规则
5)core.excludesfile中定义的全局规则
匹配语法
到9的数字,[a-z]表示匹配任意的小写字母)。
8)以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。
需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
假设我们只有过滤规则,而没有添加规则, |
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了, |
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录, |
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录; 注意要先对bin/的父目录使用!规则,使其不被排除。 |
-
为U9创建Windows文件夹右击菜单
目的
在文件夹上右击,弹出菜单,点击为U9生成gitignore文件的菜单按钮,能将该文件夹下所有的BE,BP等忽略文件自动添加到.gitignore文件中。
Windows文件夹右击菜单机制
右击菜单机制是卸载注册表中的。
路径为:计算机\HKEY_CLASSES_ROOT\Directory\shell
了解到这个之后可以自己添加一个右击菜单。
其原理就是再command节点下增加
默认的数据,
数据就是调用的exe路径。并且可以将当前点击的文件夹路径已参数的形式传递过去。
制作安装程序
Application Folder
应用程序文件夹"即"Application Folder"表示要安装的应用程序需要添加的文件;
User's Desktop
"用户桌面"即"User's Desktop"表示:这个应用程序安装完,用户的桌面上的创建的.exe快捷方式。
User's Programs Menu
"用户的'程序'菜单"即"User's Programs Menu
Menu"表示:应用程序安装完,用户的"开始菜单"中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放:应用程序.exe和卸载程序.exe;
写入注册表
我们需要再安装完成之后写入注册表信息,
所以需要一个继承System.Configuration.Install.Installer的类,可以重写
BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等方法 。
我们需要重写AfterInstall方法。
创建一个类库工程
类文件继承System.Configuration.Install.Installer
//绑定完成安装事件的处理方法
this.AfterInstall += InstallerClass_AfterInstall;
//绑定卸载完成后事件的处理方法
this.AfterUninstall += InstallerClass_AfterUninstall;
全部代码如下:
using System.Collections;
using System.ComponentModel;
using Microsoft.Win32;
namespace UFIDA.UBF.GitIgnoreClassLibrary
{
[RunInstaller(true)]
public
class
InstallerClass : System.Configuration.Install.Installer
{
private
static
string shellPath = "Directory\\shell";
private
static
string u9GitIgnore = "U9GitIgnore";
private
static
string initIgnoreFiles = "UFIDA.UBF.GitIgnoreFiles.WinForm.exe";
private
static
string contextMenuName = "[u9]自动生成git忽略文件";
public InstallerClass()
: base()
{
//绑定完成安装事件的处理方法
this.AfterInstall += InstallerClass_AfterInstall;
//绑定卸载完成后事件的处理方法
this.AfterUninstall += InstallerClass_AfterUninstall;
}
///
<summary>
/// 卸载之后,删除注册表
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void InstallerClass_AfterUninstall(object sender, System.Configuration.Install.InstallEventArgs e)
{
RegistryKey root = null;
RegistryKey rk = null;
RegistryKey u9 = null;
try
{
root = Registry.ClassesRoot;
rk = root.OpenSubKey(shellPath, true);
if (rk != null)
{
u9 = root.OpenSubKey(shellPath + "\\" + u9GitIgnore, true);
if (u9 != null)
{
rk.DeleteSubKeyTree(u9GitIgnore);
}
}
}
finally
{
if (root != null)
root.Close();
if (rk != null)
rk.Close();
if (u9 != null)
u9.Close();
}
}
///
<summary>
/// 安装完成之后写入注册表
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void InstallerClass_AfterInstall(object sender, System.Configuration.Install.InstallEventArgs e)
{
RegistryKey root = null;
RegistryKey rk = null;
RegistryKey u9key = null;
RegistryKey u9 = null;
try
{
//获取用户选择的安装路径
string path = this.Context.Parameters["targetdir"];
root = Registry.ClassesRoot;
rk = root.OpenSubKey(shellPath, true);
u9key = rk.CreateSubKey(u9GitIgnore);
u9key.SetValue("", contextMenuName);
u9 = root.OpenSubKey(shellPath + "\\" + u9GitIgnore, true);
var command = u9.CreateSubKey("command");
command.SetValue("", "\"" + path + "\\" + initIgnoreFiles + "\"" + " \"%1\"");
}
finally
{
if (root != null)
root.Close();
if (rk != null)
rk.Close();
if (u9key != null)
u9key.Close();
if (u9 != null)
u9.Close();
}
}
/// 重写安装过程方法
public
override
void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
/// 重写卸载方法
public
override
void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
/// 重写回滚方法
public
override
void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public
override
void Commit(IDictionary savedState)
{
base.Commit(savedState);
}
}
}
将上面的类文件添加到安装程序中
添加生成gitignore文件的程序exe
因为本程序还需要添加文件夹和文件,所以直接复制文件夹到Application Folder 中
打包的时候会将这些文件都安装进去。
添加自定义操作
可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择"主输出来自ClassLibrary(活动)"。这样,重新生成后,安装之后就会执行 OnAfterInstall代码了。
因为在写入注册表过程中使用到了用户安装的文件夹路径,所以需要加上CustomActionData 参数: /targetdir="[TARGETDIR]\"
配置默认文件夹路径 YONYOU
生成
就可以右击安装项目生成了
安装
完成之后我们就可以看到注册表中已经添加上了。
查看
可以看到文件夹右击菜单中有刚才的按钮,点击就可以调用我们设置的exe程序,并将当前路径传到程序中。
注意-以管理员身份运行exe程序
右击exe项目属性,
在安全性中
勾选
启用ClickOnce安全设置
然后项目中会自动生成app.mainfest文件。打开该文件:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
将 asInvoker 替换为 requireAdministrator,保存
再将安全性中
启用ClickOnce安全设置
取消勾选
这样运行exe就是已管理员身份运行