在公司里,选择ruby作为类似perl、python的脚本语言来运用,主要是想建立一些DSL.但是在工作中,遇到了一系列的问题,最终我的选择是抛弃了cruby,果断投入ironruby的怀抱。下面的故事会说明我在CRuby上是多么被折腾
项目的有部分代码需要处理一些tgz的文件(就是.tar.gz),gz的话,zlib可以处理,所以主要任务是tar, 在rubyforge上搜索的结果,大概有6-7个结果,由于不知道这些gem的代码质量如何(真不能让人放心),于是全部装上一个个跑跑看。
第一个是minitar
require 'zlib'
require 'rubygems'
require 'archive/tar/minitar'
include Archive::Tar
Minitar.unpack('c:/workspace/sun15002.tar', 'c:/x')
直接报错,原因是tar包里的目录被当成文件处理了,生成了一个空文件导致同名的目录无法建立。
第二个叫tarruby
require 'rubygems'
require 'tarruby'
Tar.gzopen('c:/workspace/sun16012.tgz', File::RDONLY, 0644, Tar::GNU | Tar::VERBOSE) do |tar|
while tar.read # or 'tar.each do ...'
puts tar.pathname
tar.print_long_ls
if tar.reg? # regular file
tar.extract_file(tar.pathname)
##if extract buffer
#puts tar.extract_buffer
end
end
end
看上去挺美,但为什么只能解压到当前目录下。。。??
从tarruby的readme看到,作者提供了个libarchive,ok,我们follow.
require 'rubygems'
require 'libarchive_ruby'
Archive.read_open_filename('C:/workspace/sun15002.tar') do |ar|
while entry = ar.next_header
name = entry.pathname
ar.extract(entry)
#data = ar.read_data
#puts "#{name} (size=#{data.size})"
end
end
看上去也挺美,问题也依旧,虽然给个机会处理data....
接下来是archive-tar,号称是个0.9的版本
require 'rubygems'
require 'archive/tar'
include Archive::Tar
Archive::Tar.extract('c:/workspace/sun15002.tar','D:/tar')
但是连路径都处理不好,直接报错。
一起覆没的还有这个:http://www.aagh.net/files/ruby-tar/ruby-tar-0.1.0.tar.gz。
测试到这时候,几乎要让人抓狂了,再继续测试下去,不知道还有多少bug. gems的质量之差劲,让人发指。成熟点的rubyzip目前还无法处理tar。
还好,这时候有ironruby(选ironruby原因主要是后续还有一些WIM文件要处理)而且有成熟的SharpZipLib,事情就变得简单了。写了个短小的程序
using System;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
namespace TgzExtractor
{
public class MiniTgz
{
public static bool Decompress_TGZ(string filename, string target)
{
//decompress tgz file
byte[] dataBuffer = new byte[4096];
Stream inStream = null;
ICSharpCode.SharpZipLib.Tar.TarArchive tarArchiv = null;
try
{
inStream = File.OpenRead(filename);
inStream = new GZipInputStream(inStream);
tarArchiv = ICSharpCode.SharpZipLib.Tar.TarArchive.CreateInputTarArchive(inStream);
tarArchiv.ExtractContents(target);
}
catch (Exception ex)
{
string.Format("Could not decompress archive {0} " + ex.ToString(), filename);
return false;
}
finally
{
if (inStream != null)
inStream.Close();
if (tarArchiv != null)
tarArchiv.Close();
}
return true;
}
}
}
编译之后,将所有dll拷贝到%ruby_home%\lib\site_ruby\1.8下,启动iirb测试一下
require 'TgzExtractor'
include TgzExtractor
MiniTgz.Decompress_TGZ("C:/workspace/sun16012.tgz","C:/tar")
一切顺利。。这只是开始,下一回合,我想让ironruby可以很简单的利用7z.dll,这样可以处理的格式就更多了!
PS: ironruby的LOAD_PATH可以通过ir.exe.config设置
<set language="Ruby" option="LibraryPaths" value="..\..\Languages\Ruby\libs;c:\ruby\lib\ruby\site_ruby\1.8;c:\ruby\lib\ruby\site_ruby;c:\ruby\lib\ruby\1.8"></set>
分享到:
相关推荐
这对于学习、定制或扩展系统功能非常有价值。开发者可以通过阅读源码学习到如何在Ruby on .NET环境中构建这样的应用,包括如何利用IronRuby的特性来编写高效、可维护的代码。 5. **Alpha版本**:"IronRuby博客中文...
这使得Ruby代码能够自我调整和扩展,增加了代码的灵活性和可维护性。 5. **2010年2月的状态**:在2010年2月,IronRuby正处于快速发展的阶段,当时的版本可能包含了许多新特性、改进和修复。这本书可能会涵盖当时的...
从提供的文件信息中,我们可以得知这篇博文主要讨论的是如何使用C# 4.0调用IronRuby中的ActiveRecord功能。不过由于博文链接和部分详细内容无法提供,知识点将基于文件信息部分和公共知识构建。 知识点一:IronRuby...
标签"职场管理"可能暗示了.NET程序员学习Ruby是为了扩展技能组合,适应职场需求,尤其是随着动态语言在软件开发中的应用日益广泛。 文章提到了两个与.NET平台相关的Ruby项目:RubyCLR和IronRuby。RubyCLR是John Lam...
2. Dynamic Language Runtime (DLR):这使得动态语言(如IronPython和IronRuby)在.NET平台上运行成为可能,并为静态语言(如C#和VB.NET)引入了动态类型。 3. Managed Extensibility Framework (MEF):这是一个...
5. **动态类型**:虽然不是C# 3.0的特性,但值得一提的是动态类型是在C# 4.0引入的,允许在运行时确定对象的类型,增强了与其他动态语言的互操作性,如与IronPython或IronRuby的交互。 6. **扩展方法**:扩展方法...
例如,可以使用IronPython或IronRuby等动态语言运行时(DLR)来执行脚本代码。C# 4.0及以上版本引入了动态类型和`dynamic`关键字,这也使得在C#中调用和交互外部脚本变得更加简单。 接下来,我们讨论一下工作流功能...
动态语言运行时(DLR)支持动态类型,为与动态语言如IronPython和IronRuby的交互提供了便利。 9. **元数据与反射**:C#利用元数据来存储关于程序集、类型和成员的信息。反射机制则允许在运行时检查和操作这些元数据...
6. **DLR和IronPython/IronRuby**:介绍Microsoft的DLR,它为动态语言提供了一个统一的运行时,并通过IronPython和IronRuby等语言展示了其能力。 7. **示例和实践**:通过实际示例和练习,让学员亲手实践元数据查询...
动态类型`dynamic`允许在运行时确定变量的类型,这在与IronPython、IronRuby等动态语言交互时非常有用。 学习C# 3.0的这些新特性,开发者可以编写出更简洁、更易维护的代码,同时利用LINQ的强大功能处理各种数据源...
2. Dynamic Language Runtime (DLR):支持动态语言,如IronPython和IronRuby,使这些语言可以无缝集成到.NET环境中。 3. Managed Extensibility Framework (MEF):用于构建可扩展的应用程序,允许外部组件轻松地插入...
2. **跨语言互操作性:** 随着IronRuby的发展,.NET开发者可以更容易地与其他语言(如Ruby)编写的代码进行交互,从而扩展自己的技能树。 3. **未来趋势展望:** 本书还将展望Ruby on Rails如何继续塑造微软的应用...
- **IronRuby**:运行在Microsoft .NET框架上的Ruby实现,为.NET开发者提供了使用Ruby的机会。 这些变体不仅拓宽了Ruby的应用范围,也为开发人员提供了更多的选择。 ### 代码示例解析 下面通过一段Ruby代码来...
VS2010不仅支持.NET语言,如C#、VB.NET、C++/CLI,还通过插件支持其他语言,如Python(IronPython)、Ruby(IronRuby)等。其中,C# 4.0引入了动态类型和命名参数等新特性,增强了语言的灵活性。 ### 5. 设计和UI...
此外,Ruby社区非常活跃,开发出了JRuby、IronRuby等不同的平台上的Ruby语言替代品,拓宽了Ruby的应用范围。 Ruby的优势还体现在其高可扩展性上。使用Ruby编写的大型程序易于维护,这得益于Ruby的模块化设计和丰富...
6. 动态语言支持:VB.NET 3.5引入了Dynamic关键字,允许在运行时绑定对象和调用方法,提高了与动态语言(如IronPython和IronRuby)交互的便利性。 在“Extended_System_Library-master”这个压缩包中,可能包含了...
3. IronRuby.dll和IronRuby.Libraries.dll:这是基于.NET框架的Ruby解释器,可能被用于Axure RP Pro中的脚本编写,允许设计师使用Ruby语言进行原型交互的编程。 4. FSharp.Core.xml:这是F#语言的核心库的XML文档,...
书中还会详细讨论如何使用IronPython和IronRuby等动态语言与.NET集成,这些语言在.NET平台上运行,充分利用了DLR的优势。此外,可能还会涉及如何利用动态数据绑定和动态对象来构建更动态的用户界面和API。 除此之外...
9. **CLR扩展性**:讨论了如何利用CLR的扩展接口,如ICLRPolicyManager和ICLRTaskManager,来定制CLR的行为。 10. **调试与诊断**:介绍了.NET的调试工具和技术,以及如何使用性能分析器进行代码性能调优。 该书的...