小编wor*_*ing的帖子

构建ruby gem并有条件地指定依赖项

我正在研究一个gem,它需要在安装gem时有条件地设置依赖项.我做了一些挖掘

看起来我并不孤单.

Rubygems:如何添加特定于平台的依赖项?

这是一个很长的线索

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

  • 那么,Linux,rb-inotify将是一个依赖项并自动安装
  • 将安装Mac-rb-fsevent
  • Windows-rb-fchange将被安装

但是,似乎并非如此.块中的"if"语句在构建和打包gem时进行评估.因此,如果您在Linux上构建并打包gem,那么,rb-inotify将作为依赖项添加,然后是rb-fsevent,Windows-rb-fchange.

仍然需要一个解决方案,我在rubygems代码中挖掘出来,似乎以下内容是对发生的事情的广泛描述.

  • 为你的gem构建所有代码:foo.gem
  • 创建一个foo.gemspec文件
  • 构建,打包并将gem发布到gem服务器,例如rubygems.org
  • 让大家知道
  • 开发人员通过以下方式在本地安装:gem install foo
  • 下载,解压缩并安装foo.gem文件.也安装了所有依赖项.
  • 一切都应该设置,我们可以使用宝石.

看来,当宝石是建立和释放的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)

ruby gem conditional dependencies

19
推荐指数
1
解决办法
4329
查看次数

golang转换包含unicode的字节数组

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 替换。

我想这就是正在发生的事情。我只是看不到答案,因为我对围棋的经验很少而且我很累。

go

2
推荐指数
1
解决办法
4503
查看次数

标签 统计

conditional ×1

dependencies ×1

gem ×1

go ×1

ruby ×1