<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ampedxx (tangxu)</title>
    <link>https://ruby-china.org/ampedxx</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>使用 Docker 打包 Ruby 项目，关于 Gem 打包的一个坑</title>
      <description>&lt;p&gt;虽然目前做微服务的项目大多数都用 go 语言了，但是我们还是想尝试用 ruby 搭建一个微服务的框架。用到的技术或者工具有 ruby + grpc + linkerd + docker + k8s。grpc 的官方网站上有 ruby 版本的例子，linkerd 也支持 grpc 的通讯，docker 和 kubenetes 就是用来部署的。&lt;/p&gt;

&lt;p&gt;由于脱离了 rails 框架，出现了很多问题。比如下面这一个&lt;/p&gt;

&lt;p&gt;&lt;em&gt;test.rb&lt;/em&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'mygem'&lt;/span&gt;
&lt;span class="no"&gt;Mygem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;say_hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Gemfile&lt;/em&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'mygem'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;git: &lt;/span&gt;&lt;span class="s1"&gt;'some git source url.......'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很简单的例子，自己写了一个 gem 包，名叫 mygem，然后放到 git 上（因为是不公开的，所以没有上传到 rubygems.org）。test.rb 这段代码在本地环境 bundle install 之后运行是没有问题的，于是我们开始下一步——用 docker 把它装起来。&lt;/p&gt;

&lt;p&gt;Dockerfile:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;slim&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jessie&lt;/span&gt;

&lt;span class="n"&gt;something&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;important&lt;/span&gt;&lt;span class="o"&gt;......&lt;/span&gt;

&lt;span class="no"&gt;COPY&lt;/span&gt; &lt;span class="no"&gt;Gemfile&lt;/span&gt; &lt;span class="no"&gt;Gemfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lock&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;/&lt;/span&gt;

&lt;span class="no"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后执行 docker build -t test:v1 .   docker build 成功了！！，一切看起来都非常顺利，直到我们使用 docker 去执行他。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;rm&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="ss"&gt;:v1&lt;/span&gt;
&lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site_ruby&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rubygems&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;core_ext&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kernel_require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`require': cannot load such file -- mygem (LoadError)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;require 'mygem' 报错了，因为 mygem 这个包没有安装到 docker 环境中。我们检查一下 bundle install 的时候有没有安装 mygem。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Using&lt;/span&gt; &lt;span class="n"&gt;mygem&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'ssh:// someurl'&lt;/span&gt;
&lt;span class="no"&gt;Fetching&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="no"&gt;Installing&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我发现，只要是在 Gemfile 里面指定 git 源的 gem 包，在 bundle install 时只会 Using，而不会 fetching 和 instaling。这在 rails 框架和本地的环境中都不是什么问题，但是放到 docker 里面，就报错了 OTZ，
目前的解决办法就是放弃指定 git 源的写法， &lt;a href="https://gemfury.com/help/install-gems/" rel="nofollow" target="_blank"&gt;https://gemfury.com/help/install-gems/&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;source: &lt;/span&gt;&lt;span class="s1"&gt;'some url'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'mygem'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种写法需要有一个私有的 gem 源，不知道还有没有别的方法了。&lt;/p&gt;</description>
      <author>ampedxx</author>
      <pubDate>Wed, 13 Jun 2018 14:14:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/36941</link>
      <guid>https://ruby-china.org/topics/36941</guid>
    </item>
    <item>
      <title>Rspec 测试，有什么方法让测试代码运行后产生的数据不被清除么。</title>
      <description>&lt;p&gt;最近在写测试的时候遇到这么个问题，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;Api&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PersonalInfosController&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: :controller&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s1"&gt;'POST #create'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;student_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'创建学生'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
            &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
            &lt;span class="n"&gt;student_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;'刚才创建的student是否还存在'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
             &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;student_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
             &lt;span class="c1"&gt;# 这个时候就会发现刚刚创建的那一个学生已经被删除了。有什么方法让他不被删除么？&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在网上看到修改 config/environments/test.rb 中的   config.cache_classes 为 false，但是并没有起作用。&lt;/p&gt;</description>
      <author>ampedxx</author>
      <pubDate>Fri, 22 Dec 2017 15:44:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/34755</link>
      <guid>https://ruby-china.org/topics/34755</guid>
    </item>
    <item>
      <title>多态关联用起来倒是方便，但是查询怎么办呢？</title>
      <description>&lt;p&gt;最近遇到一个特别蛋疼的问题：有一张表 agency_matters 是多态关联的。所以我需要很多种不同的关联这张表 (agency_matters) 的姿势：
    第一种姿势：ApplyForm.left_joins(plans: [process_works: [child_process_works: [:agency_matters]])
    第二种姿势：ApplyForm.left_joins(student: [attachment_groups:[:agency_matters]])
    第三种姿势：ApplyForm.left_joins( closures: [:agency_matters])
能不能在一个查询语句里面用三种不同的姿势 left_join 上 agency_matter 表。写 SQL 语句的话倒是可以，但是直接用 Ruby 应该怎么写呢？&lt;/p&gt;</description>
      <author>ampedxx</author>
      <pubDate>Sun, 12 Nov 2017 21:11:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/34561</link>
      <guid>https://ruby-china.org/topics/34561</guid>
    </item>
    <item>
      <title>用 pdfKit，基于 HTML 生成 PDF，服务器和本地效果不同</title>
      <description>&lt;p&gt;前不久客户需要后端生成一个 pdf，用 PDFKit 这个 gem 包。通过 html 生成 pdf，但是本地运行得到的 pdf 和把代码部署到服务器以后得到的 pdf 效果差别很大，主要是服务器上很丑，不知道怎么办。&lt;/p&gt;</description>
      <author>ampedxx</author>
      <pubDate>Tue, 05 Sep 2017 16:51:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/34030</link>
      <guid>https://ruby-china.org/topics/34030</guid>
    </item>
  </channel>
</rss>
