• 自定义Windows右击菜单调用Winform程序


    U9_Gitignore文件处理

    1. 背景

    U9代码中有许多自动生成的文件,不需要上传Git必须BE Entity中的.target文件 .bak

    文件 Enum.cs结尾的文件,还有许多 extand文件。 这些文件都不需要上传Git。

    但是这些文件太多了,不可能手动加入到ignore文件中。就需要一个工具,自动生成ignore文件。

    1. 了解ignore文件的忽略规则

    .gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

    1. .gitignore忽略规则的优先级

    在 .gitignore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):

    1)从命令行中读取可用的忽略规则

    2)当前目录定义的规则

    3)父级目录定义的规则,依次递推

    4)$GIT_DIR/info/exclude 文件中定义的规则

    5)core.excludesfile中定义的全局规则

    1. 匹配语法

    .gitignore 文件中,每一行的忽略规则的语法如下:
    1
    空格不匹配任意文件,可作为分隔符,可用反斜杠转义
    2
    )以""开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。
    3
    )可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
    4
    )以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
    5
    )以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"**" 表示匹配任意中间目录,比如`a/**/z`可以匹配 a/z, a/b/z a/b/c/z等。
    6
    )以问号"?"通配单个字符,即匹配一个任意字符;
    7
    )以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有09的数字,[a-z]表示匹配任意的小写字母)。
    8
    )以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。

    需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效

    1

    #               表示此为注释,将被Git忽略

    2

    *.a             表示忽略所有 .a 结尾的文件

    3

    !lib.a          表示但lib.a除外

    4

    /TODO           表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

    5

    build/          表示忽略 build/目录下的所有文件,过滤整个build文件夹;

    6

    doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

    7

      

    8

    bin/:           表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

    9

    /bin:           表示忽略根目录下的bin文件

    10

    /*.c:           表示忽略cat.c,不忽略 build/cat.c

    11

    debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.objtools/debug/io.obj

    12

    **/foo:         表示忽略/foo,a/foo,a/b/foo

    13

    a/**/b:         表示忽略a/b, a/x/b,a/x/y/b

    14

    !/bin/run.sh    表示不忽略bin目录下的run.sh文件

    15

    *.log:          表示忽略所有 .log 文件

    16

    config.php:     表示忽略当前路径的 config.php 文件

    17

      

    18

    /mtk/           表示过滤整个文件夹

    19

    *.zip           表示过滤所有.zip文件

    20

    /mtk/do.c       表示过滤某个具体文件

    21

      

    22

    被过滤掉的文件就不会出现在git仓库中(gitlabgithub)了,当然本地库中还有,只是push的时候不会上传。

    23

      

    24

    需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:

    25

    !*.zip

    26

    !/mtk/one.txt

    27

      

    28

    唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?

    29

    想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::

    30

    /mtk/*

    31

    !/mtk/one.txt

    32

      

    33

    假设我们只有过滤规则,而没有添加规则,

    那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!

    34

    注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,

    one.txt文件虽然加了!过滤规则,也不会生效!

    35

      

    36

    ----------------------------------------------------------------------------------

    37

    还有一些规则如下:

    38

    fd1/*

    39

    说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,

    还是某个子目录 /child/fd1/ 目录,都会被忽略;

    40

      

    41

    /fd1/*

    42

    说明:忽略根目录下的 /fd1/ 目录的全部内容;

    43

      

    44

    /*

    45

    !.gitignore

    46

    !/fw/ 

    47

    /fw/*

    48

    !/fw/bin/

    49

    !/fw/sf/

    50

    说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/  /fw/sf/ 目录;

    注意要先对bin/的父目录使用!规则,使其不被排除。

     

     

    1. 为U9创建Windows文件夹右击菜单

      1. 目的

    在文件夹上右击,弹出菜单,点击为U9生成gitignore文件的菜单按钮,能将该文件夹下所有的BE,BP等忽略文件自动添加到.gitignore文件中。

    1. Windows文件夹右击菜单机制

    右击菜单机制是卸载注册表中的。

    路径为:计算机HKEY_CLASSES_ROOTDirectoryshell

    了解到这个之后可以自己添加一个右击菜单。

    其原理就是再command节点下增加 默认的数据, 数据就是调用的exe路径。并且可以将当前点击的文件夹路径已参数的形式传递过去。

    1. 制作安装程序

    1. Application Folder

    应用程序文件夹"即"Application Folder"表示要安装的应用程序需要添加的文件;

    1. User's Desktop

    "用户桌面"即"User's Desktop"表示:这个应用程序安装完,用户的桌面上的创建的.exe快捷方式。

    1. User's Programs Menu

    "用户的'程序'菜单"即"User's Programs Menu

    Menu"表示:应用程序安装完,用户的"开始菜单"中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放:应用程序.exe和卸载程序.exe

    1. 写入注册表

    我们需要再安装完成之后写入注册表信息,

    所以需要一个继承System.Configuration.Install.Installer的类,可以重写

    BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等方法 。

    我们需要重写AfterInstall方法。

     

    1. 创建一个类库工程

    类文件继承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);

    }

    }

    }

     

    1. 将上面的类文件添加到安装程序中

    1. 添加生成gitignore文件的程序exe

    因为本程序还需要添加文件夹和文件,所以直接复制文件夹到Application Folder 中

     

    打包的时候会将这些文件都安装进去。

    1. 添加自定义操作

    可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择"主输出来自ClassLibrary(活动)"。这样,重新生成后,安装之后就会执行 OnAfterInstall代码了。 

     

    因为在写入注册表过程中使用到了用户安装的文件夹路径,所以需要加上CustomActionData 参数: /targetdir="[TARGETDIR]"

    配置默认文件夹路径 YONYOU

    1. 生成

    就可以右击安装项目生成了

    1. 安装

    完成之后我们就可以看到注册表中已经添加上了。

    1. 查看

    可以看到文件夹右击菜单中有刚才的按钮,点击就可以调用我们设置的exe程序,并将当前路径传到程序中。

    1. 注意-以管理员身份运行exe程序

    右击exe项目属性,

    在安全性中 勾选 启用ClickOnce安全设置

    然后项目中会自动生成app.mainfest文件。打开该文件:

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    asInvoker 替换为 requireAdministrator,保存

    再将安全性中 启用ClickOnce安全设置 取消勾选

    这样运行exe就是已管理员身份运行

  • 相关阅读:
    Android 媒体存储服务(二)
    Android 媒体存储服务(一)
    MTP in Android详解
    Source Insight 常用设置和快捷键大全
    Android 中onSaveInstanceState和onRestoreInstanceState学习
    Android RadioButton 语言无法切换问题
    Android 中onConfigurationChanged问题
    欢迎访问我的CSDN博客
    Java-异常
    Java-finally相关问题
  • 原文地址:https://www.cnblogs.com/alua/p/10524318.html
Copyright © 2020-2023  润新知