我正在研究一个gem,它需要在安装gem时有条件地设置依赖项.我做了一些挖掘
看起来我并不孤单.
http://www.ruby-forum.com/topic/957999
我可以看到向gem添加依赖项的唯一方法是在.gemspec文件中的Gem :: Specifiction块中使用add_dependency方法
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
Run Code Online (Sandbox Code Playgroud)
基于我在网上找到的所有文档和线程,我希望如果你安装gem
但是,似乎并非如此.块中的"if"语句在构建和打包gem时进行评估.因此,如果您在Linux上构建并打包gem,那么,rb-inotify将作为依赖项添加,然后是rb-fsevent,Windows-rb-fchange.
仍然需要一个解决方案,我在rubygems代码中挖掘出来,似乎以下内容是对发生的事情的广泛描述.
看来,当宝石是建立和释放的foo.gemspec文件被加载并在宝石::规格块被评估并转换为YAML,压缩为metadata.gz,并包含在foo.gem.ruby代码被压缩成data.tar.gz并包含在内.当gem安装在本地开发人员机器上时,YAML从metadata.gz中提取并转换回Gem :: Specification块,但是,它不会转换回原始块.
相反,你会看到如下内容:
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, …Run Code Online (Sandbox Code Playgroud) type MyStruct struct {
Value json.RawMessage `json:"value"`
}
var resp *http.Response
if resp, err = http.DefaultClient.Do(req); err == nil {
if resp.StatusCode == 200 {
var buffer []byte
if buffer, err = ioutil.ReadAll(resp.Body); err == nil {
mystruct = &MyStruct{}
err = json.Unmarshal(buffer, mystruct)
}
}
}
fmt.Println(string(mystruct.Value))
Run Code Online (Sandbox Code Playgroud)
它产生类似的东西:
\u003Chead>\n \u003C/head>\n \u003Cbody>
Run Code Online (Sandbox Code Playgroud)
文档位于: http: //golang.org/pkg/encoding/json/#Unmarshal
说:当解组带引号的字符串时,无效的 UTF-8 或无效的 UTF-16 代理项对不会被视为错误。相反,它们被 Unicode 替换字符 U+FFFD 替换。
我想这就是正在发生的事情。我只是看不到答案,因为我对围棋的经验很少而且我很累。