Sup*_*nic 3 ruby svn windows tortoisesvn command-line
我有安装了命令行界面的Tortoise SVN.安装路径是C:\Program Files\TortoiseSVN\bin在那里svn.exe,每当我使用任何SVN命令时使用.
我开发了一个Ruby Windows应用程序,它作为后台进程运行.此应用程序运行命令
svn info "#{path_to_repository}"
Run Code Online (Sandbox Code Playgroud)
这个命令svn.exe就像我提到的那样调用.
问题是,svn.exe一秒钟闪烁一个命令提示符并终止,因此如果我svn info为十个不同的存储库运行十次,那么当该命令被开发为及时运行时,屏幕会闪烁十次,屏幕会经常闪烁十次.
我需要的是一种通过Tortoise SVN运行SVN命令而无需svn.exe弹出屏幕和关闭的方法.
Ruby有很多在shell中执行命令的方法,但是,在GUI App中使用时,所有选项都会出现命令行弹出窗口.
根据您要查找的详细信息svn info,您可以使用一个选项,例如WebSVN,并查看是否可以删除 GUI或从其RSS源获取数据. 看看这个产品的演示网站.
如果您有非常特定和最小的需求,那么您还可以选择构建一个可以使用命令行查询subversion服务器的小型REST API.在这种情况下,您可以调用REST API来获取数据并避免弹出command窗口.
如果您的时间非常短或者没有服务器基础结构来托管REST API,那么您可以考虑创建一个运行套接字服务器的Ruby应用程序,并且可以在从客户端接收命令时运行shell命令.然后,您可以使用套接字客户端使GUI应用程序连接到套接字服务器,并要求服务器应用程序执行svn info并返回结果. 阅读构建此类交互式应用程序的教程.然后,您可以选择在同一台PC上并排运行它们.
另一种方法是使用Ruby SVN绑定.它可能需要一些挖掘才能使其工作.
这是快速入门代码:
server.rb - 一个ruby TCP服务器,它接受命令并在shell中执行它们
require 'socket'
server = TCPServer.open(2000) # Socket to listen on port 2000
puts "Listening now #{server.addr}"
loop {
Thread.start(server.accept) do |client|
cmd = client.gets
puts "Processing #{cmd} from #{client.peeraddr}"
IO.popen(cmd) { |s| result = [];
while (line = s.gets) do
client.puts line.chop
end;
}
client.close
end
}
Run Code Online (Sandbox Code Playgroud)
app.rb一个Shoes GUI应用程序,它svn info向正在运行的TCP服务器发出命令server.rb
要求'插座'
Shoes.app {
stack do
@push = button "Get SVN Info"
@note = para ""
end
@push.click {
hostname = 'localhost'
port = 2000
result = []
s = TCPSocket.open(hostname, port)
s.puts "svn info trunk/backend"
while line = s.gets
result << line.chop
end
s.close
@note.replace result.join("\n")
}
}
Run Code Online (Sandbox Code Playgroud)
app.rb应该使用shoes app.rb命令启动.
此行为不是特定于Ruby,而是特定于Windows命令行解释器.有几种方法可以解决它.
svn前缀的命令,cmd.exe /C该命令不应该闪烁命令提示符窗口.其变体是start /min用作前缀.这在所有情况下都不起作用,我没有方便的Ruby on Windows检查..vbs为您的命令创建一个包装器.由于.vbs不是由命令行解释器处理,因此不会创建其窗口.有关详细信息,请参阅" 如何在不启动'命令窗口'的情况下运行批处理文件? ".最好的选择是使用WinAPI包装器gem来访问ShellExecute非常灵活的函数:
require 'win32ole'
# Create an instance of the Windows Shell object...
shell = WIN32OLE.new('Shell.Application')
# The shell object's ShellExecute method performs a specified operation on a specified file. The syntax is...
shell.ShellExecute(FILE, ARGUMENTS, DIRECTORY, OPERATION, SHOW)
Run Code Online (Sandbox Code Playgroud)
此示例取自" 使用Windows Shell启动应用程序和打印文档 ",您可以在其中找到更多详细信息.
为了你的目的,它会是这样的
shell.ShellExecute('svn.exe', 'info', path_to_repository, 'open', 0)
Run Code Online (Sandbox Code Playgroud)详细了解ShellExecute使用情况.