最好的写作方法是什么 钩子 为了 颠覆视窗?据我所知,只能使用可执行文件。那么什么是最好的选择呢?

  • 普通批处理文件(非常有限,但对于非常简单的解决方案来说也许可以)
  • 专用编译的可执行应用程序(大锤破解坚果壳?)
  • 其他一些混合选择(例如运行 Powershell 脚本的批处理文件)
有帮助吗?

解决方案

我刚刚花了几天时间来解决这个问题。有可用的第三方产品和大量 PERL 和 Python 脚本,但我想要一些简单的东西和我熟悉的语言,所以最终只是在 C# 控制台应用程序中编写钩子。这非常简单:

public void Main(string[] args)
{
  string repositories = args[0];
  string transaction = args[1];

  var processStartInfo = new ProcessStartInfo
                           {
                             FileName = "svnlook.exe",
                             UseShellExecute = false,
                             CreateNoWindow = true,
                             RedirectStandardOutput = true,
                             RedirectStandardError = true,
                             Arguments = String.Format("log -t \"{0}\" \"{1}\"", transaction, repositories)
                           };

  var p = Process.Start(processStartInfo);
  var s = p.StandardOutput.ReadToEnd();
  p.WaitForExit();

  if (s == string.Empty)
  {
    Console.Error.WriteLine("Message must be provided");
    Environment.Exit(1);
  }

  Environment.Exit(0);
}

然后,您可以在预提交时调用它,方法是使用以下行将 pre-commit.cmd 文件添加到存储库的 hooks 文件夹中:

[path]\PreCommit.exe %1 %2

您可能会认为这太过分了,但最终这只是几分钟的编码。此外,您还可以利用 .NET 语言套件的优势,恕我直言,它比其他语言套件更可取。我将显着扩展我的钩子,并针对它们编写适当的测试——使用 DOS 批处理文件来做到这一点有点困难!

顺便说一句,该代码已改编自 这个帖子.

其他提示

我们有复杂的要求,例如:

  1. 只有某些用户可以在 SVN 树的某些部分创建文件夹,但每个人都可以编辑其中的文件
  2. 某些文件扩展名不能包含文件中的某些文本
  3. 某些文件扩展名只能存储在目录的子集中
  4. 以及一些更简单的,例如,必须有提交评论
  5. 通过针对所有以前的 SVN 提交运行新的钩子可进行回归测试

#5 对我们来说意义重大,没有比能够通过新钩子推送所有以前的提交更好的方法来知道您不会中断提交。让钩子了解 1234 是修订版本,1234-1 是事务,并在调用 svnlook 等时进行适当的参数更改。是我们在此过程中做出的最佳决定。

对于我们来说,问题已经足够大,以至于完全可单元测试、可回归测试的 C# 控制台 exe 是最有意义的。我们有配置文件来满足目录限制,解析现有的 httpd_authz 文件以获取“特权”用户等。如果我们没有在 Windows 上运行 .NET 开发人员,我可能会全部用 Python 编写,但由于其他人将来可能需要支持它,所以我选择了 .NET,而不是 .BAT、.VBS、Powershell。

就我个人而言,我认为 Powershell 与 .NET 有足够的不同,作为一种“脚本”语言几乎没有什么用处。如果产品的唯一命令行支持来自 PS(Exchange、Windows 2k8)等,那就太好了。但如果您只想解析一些文本或访问常规 .NET 对象,那么 PS 只是添加了疯狂的语法和愚蠢的安全铁幕,这可能是一个快速而简单的小型 .NET 应用程序。

查看 霍克船长, ,“一个使用 .NET 编写 Subversion 挂钩的简单插件框架”。

根据复杂程度,每种情况都不同,如果我只是简单地移动文件,我会编写一个快速批处理文件。如果我想做一些更复杂的事情,我通常会跳过脚本部分并编写一个可以处理它的快速 C# 程序。

那么问题是你是否将该 c# 程序放入 svn 并对其进行版本控制:)

编辑: 专用 C# 应用程序的好处是,我可以重用代码片段来创建新的挂钩,包括我创建的用于处理挂钩日志记录的简单日志输出。

我已经写了钩子 Python 在 Windows 上,因为网上有很多示例(通常针对 Linux,但差异很小)。我们还使用 特拉克 与 SVN 集成,并且有一个可通过 Python 访问的 Trac API,它允许我们从 SVN 挂钩脚本自动创建/修改 Trac 票证。

如果您有一个借助简单 php 类的 php 可执行文件,您可以在 php 中编写钩子脚本,如下所示 http://www.devhands.com/2010/01/subversion-hook-php-framework-in/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top