Err the Blog Atom Feed Icon
Err the Blog
Rubyisms and Railities
  • “Vendor Everything”
    – Chris on March 27, 2007

    Advertisement

    Seriously. You’ll thank me later.

    What do I mean, exactly? Well, let’s say you’re working on a small Rails team. You decide to start using test/spec. Be dee dee. As usual, you gem install test-spec then Pistonize the plugin. You start writing specs and begin converting existing tests to specs. You’re on a tear. Nothing can stop you. Behavior is king. You commit your changes.

    You break the build.

    What? Why? Well, all your new specs depend on the test-spec gem, a gem your comrades and continuous integration builder do not have.

    Quickly: fix it! Tell everyone to install the gem locally. Install the gem on your staging server. Carefully install the gem on your production server. Phew. Everyone’s got the same version, right? Right. Well, maybe. (At least the build works.)

    See, there’s something wrong with this scenario: it’s not very DRY. Why should only our code be DRY? Why not our environment, too? It should be.

    The solution we’ve come up with is to throw every Ruby dependency in vendor. Everything. Savvy? Everyone is always on the same page: we don’t have to worry about who has what version of which gem. (we know) We don’t have to worry about getting everyone to update a gem. (we just do it once) We don’t have to worry about breaking the build with our libraries. (we leave that up to the internet entrepreneurs)

    Adding Depended Sees

    Alright, alright, let’s see how we’d vendor the test-spec gem. First, the vendor directory:
    $ ls -1 vendor/
    bin
    data
    gems
    plugins
    rails
    

    We obviously added a few directories, namely gems, data, and bin. The rails and plugins directories should be familiar, one hopes.

    Let’s focus on the the vendor/gems directory:
    $ ls -1 vendor/gems/
    RedCloth-3.0.4
    RubyInline-3.6.2
    crypt-1.1.4
    image_science-1.1.1
    memcache-client-1.3.0
    session-2.4.0
    sphinx-0.9.7-rc2
    
    We’ll cd in there and then use the handy gem unpack command to, erm, unpack the contents of our test-spec gem:
    $ gem unpack test-spec
    Unpacked gem: 'test-spec-0.3.0'
    

    Cool. Now we need to dive into our config/environment.rb file to ensure Rails knows to look in vendor/gems/test-spec-0.3.0/lib when we try to require ‘test/spec’. It’s easier than you think.

    Add this to your Rails::Initializer.run block:

    config.load_paths += Dir["#{RAILS_ROOT}/vendor/gems/**"].map do |dir| 
      File.directory?(lib = "#{dir}/lib") ? lib : dir
    end
    

    Now all the libraries in vendor/gems will automatically be included in your load path, complete with a lib check for libraries like RubyInline and crypt (which don’t come with lib directories).

    Want to only include some libraries in a specific environment? Maybe you don’t want RubyInline or image_science in development mode. Put this under the above snippet o’ code:

    if %w(development test).include? RAILS_ENV
      config.load_paths.delete_if { |f| f =~ /RubyInline|image_science/ }
    end  
    

    Good to go.

    It should be noted that this trick will not auto-require the gems for you. You still need to do that in your config file, or in your gems, or wherever. Maybe with a line like %w(crypt/blowfish redcloth).each { |f| require f } in your config/environment.rb if it pleases you.

    Other Approaches

    For one, Dr Nic has something cool: this patch. It lets you run tasks from within vendor/gems right from your RAILS_ROOT. Nifty. He’s also got his gemsonrails plugin which is a similar (but different) approach than we illustrate here.

    Jay Fields has his own method for autoloading gems in vendor. Worth a look, and a listen.

    Classic Railer topfunky, back in the day, rolled a rake task to scratch the same itch.

    Then there’s this thread on Rails-Core about adding some kinda gemy-ness to Core which, unfortunately, hasn’t yet transpired. The gem in question, the one to metaly manage other gems, lives in technoweenie’s repository.

    I even do this (for better or worse) with cache_fu, btw. I am starting to really like not being dependent on the environment.

    All Set!

    The goal here is simple: always get everyone, especially your production environment, on the same page. You don’t want to guess at which gems everyone does and does not have. Right.

    There’s another point lurking subtlety in the background: once all your gems are under version control, you can (probably) get your app up and running at any point of its existence without fuss. You can also see, quite easily, which versions of what gems you were using when. A real history.

  • Ben, about 4 hours later:

    Nice write-up… thanks.

    You never said what /vendor/bin and /vendor/data were for…

  • Dr Nic, about 6 hours later:

    Amen.

  • mathie, about 7 hours later:

    Great idea! We did start out this way on the project I’m currently most involved in (pretty much exactly as you’ve described, though we chose not to put the version numbers in the gem’s directory name) and it worked well … to a degree.

    How do you deal with extension-based gems that need C code to be built?

  • Val Aleksenko, about 11 hours later:

    You can just set GEM_HOME in you config/boot.rb like this: ENV[‘GEM_HOME’] = File.join(RAILS_ROOT, ‘vendor’, ‘gems’)

    and it would give you all the advantages without any additional coding.

    We use the similar approach only when need to lock down out app to specific (tested) gems versions – http://revolutiononrails.blogspot.com/2007/02/locking-down-deployed-application.html

  • Ned Baldessin, about 11 hours later:

    One problem this creates, is that doing a deploy with capistrano takes ages, because you’re exporting a huge number of files from SVN. One solution to this is to not put them into version control and symlink the vendor/ directory after deploy.

  • Jason Young, about 11 hours later:

    No.

    Please don’t. Please for the love of others having to deal with your code, don’t put core dependencies in vendor (not if you control your servers, or your team/company does). Having a little developer communication about the gems that you as a team are going to decide to use is a whole lot better down the line then having dozens of different copies of a gem lying around – when you realistically only need one.

    That way when the next “Upgrade your Rails NOW NOW NOW” occurs, you can deal with the upgrades once, and not dozens of times for applications that you’ve probably forgotten that you ever wrote, much less deployed – at old contract jobs left long ago.

  • Chris, about 12 hours later:

    mathie: So far it hasn’t been a problem. Our vendor/bin directory houses a subdirectory for each arch (i686-darwin8.8.2, powerpc-darwin8.6.0, x86_64-linux) so we throw some compiled code in there. We have a tmp/inline directory created on deploy for RubyInline, and we don’t actually vendor mongrel—so that pretty much covers it all.

  • Chris, about 12 hours later:

    Val: Nice! That’s a neat trick. How would you exclude gems on a per-environment basis, though?

  • Val Aleksenko, about 12 hours later:

    To Chris: The same way you’d normally do with regular gems – you only require those gems unless RAILS_ENV == ‘production’ or but putting requires in corresponding config/environments/*.rb

  • Chris, about 12 hours later:

    Ned: Or you can have cap run svn up. One of the big advantages of this method is being able to deploy and roll back gems in case of an emergency. Version control is a huge win here.

  • PJ, about 13 hours later:

    Jason, in theory that makes sense, but when you’re working in larger teams and you don’t want to explain to your CSS guy for the fifth time how to install/update their gems, you’ll be happy knowing that all of the dependencies are in vendor.

    As far as the slow-going deploys with everything unpacked in vendor, that’s such a huge misnomer. We’re talking about a 5-10 second difference. (At least for our servers)

  • Adam Sanderson, about 14 hours later:

    Hey that looks like a really neat solution. Always glad to see what you cook up here.

  • Eduardo Rocha, about 15 hours later:

    What about a Maven approach? Maybe we could have config/gems.yml, and always have this checked to see if all gems and theirs versions where installed.

  • Eduardo Rocha, about 15 hours later:

    And have them installed automatically if not there… :)

  • Val Aleksenko, about 16 hours later:

    To Eduardo: We use similar approach @Revolution

    Each application or component has its own config defining gem dependencies with versions. It is being used at runtime to load specific gems. An example:
    :dependencies:
      - ['rails', '1.1.6']
      - ['json', '~> 0.4']
    

    The same config is used for packaging to a gem so the dependencies are translated to gem dependencies. It means that when you ‘gem install’ a gem created that way, you also pick up all the dependencies declared. Works us for us pretty good.

  • nicholas a. evans, about 19 hours later:

    I’ve been slowly pushing my team in this direction as well. I really really like having as much as possible in version control, and I find that the benefits (time travel, instantly deployed dependencies) far outweigh the costs (wasted disk space, slightly longer checkouts). For applications where the deployment team wants tight control over what gems are installed where, how, etc… or if other trade-offs are in play, I can see the approach that Val uses at Revolution Health being very useful.

    Chris, would you mind giving a bit more detail about how you do this for a gem with C extensions (rMagick, for example) and how you handle the bin directory? Do the contents of your bin directory come from gems, or is it only for homegrown compiled binaries?

  • Jason Young, about 24 hours later:

    PJ – I’d hope that the design-o that managed to get Locomotive installed and working and groks subversion (or at least textmate bundles that shell out to svn) well enough to check their CSS changes into a repository could learn to handle gem update/install.

    Chris, I do love you man – in that totally platonic developer sort-a-way. The blog post wasn’t all about you – it was mainly for your legion of adoring admirers that don’t think for themselves.

    But I agree, CAPS LOCK TEXT IS LOVE :-)

  • Rich Collins, 24 days later:

    I was wondering about compiled binaries as well. Do you have an easy way to recompile between platforms?

  • Lori Olson, 28 days later:

    +1 for the “giving a bit more detail about how you do this for a gem with C extensions (rMagick, for example) and how you handle the bin directory”

    With a web designer/CSS guy on Windows, developers on Intel and PPC Macs, build, test, and production servers on Linux, this is a non-trivial issue for our team.

  • Shane Vitarana, 2 months later:

    I’m totally for the vendor everything approach, but

    gem unpack
    just copies the source files and doesn’t build anything. As Lori mentions, some gems with C extensions need to be compiled first, such as ruby-xslt. In this case you still have to run
    gem install
    .

    I guess one solution is to use

    gem install
    with the
    -i
    option for your vendor/gems directory. The load paths would have to be changed to reflect this.

  • Kyle Maxwell, 2 months later:

    I wrote a simple Rails plugin to build your C extensions in the vendor everything approach. You’ll prolly want include it into your Capistrano workflow, although that is left as an exercise for the user ;).

    http://svn.kylemaxwell.com/rails_plugins/vendor_everything_extensions/

    Usage: rake vendor:build_extensions

  • Jodi, 2 months later:

    I know I’m coming to this party late, but I thought I’d throw this in the fridge in case anyone’s still thirsty.

    lovin this !

    a correct to Val’s otherwise great solution: “GEM_HOME for writing, GEM_PATH for reading!” from http://wiki.rubyonrails.org/rails/pages/HowToUseMultipleGemRepositories

    so you’ll want to: ENV[‘GEM_PATH’] = File.join(RAILS_ROOT, ‘vendor’, ‘gems’)

    (not gem home as suggested).

    cheers,Jodi

  • Chris Kampmeier, 2 months later:

    Ned/Chris/PJ: the speed of your deploys shouldn’t be a factor once you move over to Capistrano 2.0, because we’ve got this now:

    set :deploy_via, :remote_cache

    This creates a cached copy of your code in the shared directory, and just runs an ‘svn up’ on that when you deploy. This code then gets copied to the releases directory as usual. Nice and speedy.

  • Bala Paranj, 10 months later:

    How did you get the vendor gems directory? I don’t have that in my vendor directory.

  • roupen n., 10 months later:

    Chris, what about \vendor\data what’s that for? you talked about \vendor\bin

  • Mike Herrick, 11 months later:

    I’m trying to get this set up with a Rails 2.0 based application.

    Any updates on this approach. I’m probably missing something obvious, but while the application works fine via ruby script/server I can’t run any rake tasks (fail looking for gems used by rake tasks). I am guessing I have to set the load path somewhere, but don’t know where. I had hoped that the config/environment.rb settings would get picked up and it would just work, but doesn’t seem to be the case.

    Any ideas?

    Thanks.

  • Barrett, about 1 year later:

    For RMagick we just copied the necessary file(s) into the vendor/gem/rmagick… directory. There is a RMagick2.so (Rmagick2.bundle on Mac) file that is required.

    Same deal with our Sybase adapter.

    Good to go. So far.

  • Smith, about 1 year later:

    The best article, thanks to the author. good jokes, funny jokes

  • Heart Tattoos, about 1 year later:

    Tattoos Celtic Tattoos Lower Back Tattoos Dragon Tattoos Skull Tattoos Heart Tattoos Butterfly Tattoos Chinese Tattoos Layered Hair Styles Layered Hairstyles Emo Hairstyles Medium Hairstyles Bang Hairstyle Prom Hairstyle Hair Coloring Heart Lower Back Tattoos

  • bodom, about 1 year later:

    How to download and convert the FLV files on Mac OS? Here are the easy-to-use and top-user-rating [url=http://www.downloadyoutubeformac.com/free-youtube-downloader-for-mac.html]Free YouTube Downloader for Mac[/url] and FLV converter tools. It is safe to install and there are no spyware or adware.

  • ffffffffff, about 1 year later:

    How to download YouTube videos for mac and convert the .FLV files on Mac OS? Here are the easy-to-use and top-user-rating YouTube Video Grabber Mac and Mac FLV converter tools. It is safe to install and no spyware or adware guarenteed.

  • boxer, about 1 year later:

    With the YouTube Converter for Mac application, you can easily download youtube for mac and convert YouTube videos on your Mac OS.

  • reach, about 1 year later:

    I suggest 2 FLV Converter for Mac software. One is powerful in download YouTube Videos and convert downloaded FLV files; the other is professional in video converting, which can not only convert .flv video to all media formats, but also can convert all kinds of video formats to .flv, plus popular videos.

  • care for the elderly, about 1 year later:

    For anyone with old or elderly loved ones, it is important to take care of your care for the elderly at home residential care facility for the elderly residential care facilities for the elderly care for the elderly at home nursing care for the elderly residential care for the elderly care services for the elderly social care for the elderly care homes for the elderly care home for the elderly community care for the elderly in hopes making sure you or your old / elderly loved ones are taken care of with the best nursing care available.

  • sexs, about 1 year later:

    sikiş porno sex video izle iyi porno uzun porno yeni pornolar porno seyret sex seyret porno filmler sex izleyin sex izle porno sex erotik porn video türk porno canlı porno porno izle porno porno film sex filmleri porn video porno film sex seyret porno video seyret orgazm porno seks izle erotik video sex videolar yetişkin video sex video izle porno video izle bedava porno 18 video seks porno sıcak izle yetişkin film sikiş seyret sex amatör videolar teen video erotik videolar yetişkin video yetişkin videolar pornolar porno video teen kızlık bozma sikiş sikiş video seks türban sex sex erotik seks izle sıcak ateşli

  • , about 1 year later:
    thanks

    دليل مواقع - منتدى - يوتب

    fg,j,e ];j,v fg,j,e - برق fvr - نت لوق kj g,r - مدرسة المشاغبين l]vsm hglahyfdk - جريدة الرياض [vd]m hgvdhq - fvhl[ kj برامج نت - You tube يو تيوب - jvhtdhk ترافيان - العاب hguhf -  برامج جي سوفت fvhl[ [d s,tj – دردشة تعب قلبي ]v]am juf rgfd - شات الرياض ahj hgvdhq - بلوتوث غشمشم fg,j,e yalal –

  • Earth4Energy, about 1 year later:

    Nice article.

  • asd, about 1 year later:

    modern abstract art sofa manufacturer гранит 净水器 混合机 过滤机 DHL快递 保险箱 法兰 法兰标准 牛皮癣 皮肤病 北京快递公司 北京国际快递 传世私服 传奇世界私服 天龙八部私服 天龙私服 网络电话 免费网络电话 假发 补发 织发 植发 上海搬家公司 上海搬场公司 大众搬家 大众搬场 张家界旅游 香港旅游 深圳旅行社 打包机 收缩机 萎缩性胃炎 neoprene laptop bags SEO优化 SEO优化 计量泵 胃炎 胃病 冷水机 冰水机 工业冷水机 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 油罐车 北京办证 办证 北京特价机票 北京打折计票 北京国际机票 北京机票预定 北京飞机票 北京订机票 北京机票查询 血糖仪 血糖仪 银杏 水培花卉 企业宣传片 空分设备 机电设备安装 代孕 代孕网 代孕 代孕 代孕 试管婴儿 代孕 电话交换机 程控交换机 集团电话 集装袋 混合机混合机 混合机捏合机 捏合机 捏合机导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 回流焊 波峰焊 spherical roller bearing 搬运车 搬运车 电动搬运车 油桶搬运车 堆高车 电动堆高车 半电动堆高车 堆垛车 高空作业平台车 电动叉车 平衡重叉车 前移叉车 电瓶叉车 苗木价格 苗木信息 标牌制作 深圳标牌 儿童摄影 北京儿童摄影 防静电鞋 淘宝刷信誉 威海凤凰湖 威海海景房 大庆密封件 打标机 淘宝刷信誉 TESOL/TEFL国际英语教师证书 英语教师进修及培训 韩国饰品批发 代写论文 代写论文 代写论文 代写代发 论文代写 电源模块 模块电源 X架 超薄灯箱> 易拉宝 展柜制作 代理服务器 游戏加速器 网络加速器 网通加速器 电信加速器 电信网通转换器 电信网通加速器 网通电信互转 网通电信互通 网络游戏加速器 美国VPN代理 美国独享VPN 美国独享IP pvc ceiling panel Spherical roller bearings 天龙八部私服 SEO优化 安全鞋 劳保鞋 防砸鞋 电绝缘鞋 上海安全鞋 上海劳保鞋 江苏劳保鞋 服装软件 服装管理软件 进销存软件 进销存管理软件 服装管理系统 服装进销存软件 进销存系统 进销存管理系统 免费进销存软件 吉林中医 东北特产 打包机 dhl 阳痿 阴茎短小 阴茎增大 早泄 前列腺炎 阴茎增粗 阴茎延长 国际机票 上海国际机票 国际打折机票 国际特价机票 CRM 客户管理软件 客户关系管理 免费客户管理软件 客户管理软件下载 客户信息管理系统 销售管理系统 销售管理 CRM系统 CRM软件 客户关系管理系统 客户关系管理软件 客户管理 客户管理系统 营销管理系统 客户资源管理 销售管理软件 客户资料管理软件 客户资源管理软件 客户信息管理软件 客户资料管理 客户资源管理 客户信息管理 客户资料管理系统 客户资源管理系统 客户管理软件免费版 砂磨机 砂磨机 砂磨机 卧式砂磨机 卧式砂磨机 卧式砂磨机 三辊研磨机 三辊研磨机 三辊研磨机 混合机 混合机 混合机 锥形混合机 锥形混合机 锥形混合机 行星动力混合机 行星动力混合机 行星动力混合机 无重力混合机 无重力混合机 无重力混合机 干粉砂浆设备 干粉砂浆设备 干粉砂浆设备 捏合机 捏合机 捏合机 导热油炉 导热油炉 导热油炉 反应釜 反应釜 反应釜 搪玻璃反应釜 搪玻璃反应釜 搪玻璃反应釜 乳化机 涂料设备 干混砂浆设备 无重力混合机 胶体磨 涂料成套设备 双螺旋混合机 北京婚庆 北京婚庆公司 400电话 办证 呼吸机 制氧机 亚都 亚都加湿器 亚都净化器 亚都装修卫士 饰品批发 小饰品批发 韩国饰品 韩国饰品批发 premature ejaculation penis enlargement 破碎机 制砂机 球磨机 雷蒙磨 雷蒙磨粉机 鄂式破碎机 鄂式破碎机 免烧砖机 加气混凝土设备 反击式破碎机 选矿设备 安利产品 马来西亚留学 网站优化 网站推广 衬布 代写论文 代写论文 代写论文 论文代写 代写论文 代写硕士论文 代写毕业论文 磁力泵 离心泵 化工泵 隔膜泵 螺杆泵 潜水泵 油泵 耐腐蚀泵 泵 水泵 拖链 防护罩 排屑机 塑料拖链 钢铝拖链 水泵 磁力泵 隔膜泵 离心泵 液下泵 自吸泵 多级泵 排污泵 螺杆泵 油泵 化工泵 电动隔膜泵 气动隔膜泵 自吸式磁力泵 氟塑料磁力泵 管道离心泵 导热油泵 深井泵 潜水泵 污水泵 潜水排污泵 深圳装饰 深圳装饰公司 深圳装修公司 特价机票 打折机票 国际机票 机票 新风换气机 换气机 立式新风换气机 风机箱 新风系统 能量回收机 搅拌机 混合机 乳化机 分散机 毛刷 毛刷辊 工业毛刷 刷子 钢丝刷 涂层测厚仪 硬度计 兆欧表 激光测距仪 测振仪 转速表 温湿度计 风速仪 超声波测厚仪 粗糙度仪 噪音计 红外测温仪 万用表 硬度计 万用表 美容院 美容加盟 澳洲留学 澳大利亚留学 什么是法兰 电烤箱 酒店预定 北京酒店预定 北京酒店 离心机 nail equipment nail products nail product nail uv lamp nail uv lamp nail uv lamps uv nail lamp nail brush nail file nail tool nail tip nail gel curing uv lamps lights 万用表 风速仪 红外测温仪 噪音计

  • 123, about 1 year later:

    情趣用品,情趣用品,情趣用品,情趣用品,情趣用品,情趣,情趣,情趣,情趣,情人歡愉用品,情惑用品性哥,情人用品性哥,情趣用品,AIO交友愛情館,情人歡愉用品,美女視訊,情色交友,情人用品性哥,視訊交友,辣妹視訊,美女交友,性愛,嘟嘟成人網,按摩棒,震動按摩棒,微調按摩棒,情趣按摩棒,逼真按摩棒,G點,跳蛋,跳蛋,跳蛋,性感內衣,飛機杯,充氣娃娃,情趣娃娃,角色扮演,性感睡衣,後庭區,SM,潤滑液,情趣禮物,威而柔,香水,精油,芳香精油,自慰,自慰套,性感吊帶襪,情趣用品加盟,情人節禮物,情人節,吊帶襪,辣妹視訊,美女交友,情色交友,成人交友,視訊聊天室,美女視訊,視訊美女,情色視訊,免費視訊聊天,視訊交友,視訊聊天,AIO交友愛情館,嘟嘟成人網,成人貼圖,成人網站,AIO交友愛情館,情色,情色貼圖,情色文學,情色交友,色情聊天室,色情小說,七夕情人節,色情,A片,A片下載,免費A片,免費A片下載,情色視訊,情色電影,色情網站,辣妹視訊,視訊聊天室,情色視訊,免費視訊聊天,視訊聊天,美女視訊,視訊美女,美女交友,美女,情色交友,成人交友,自拍,本土自拍,情人視訊網,視訊交友90739,生日禮物,情色論壇,正妹牆,正妹,成人網站,A片,免費A片,A片下載,免費A片下載,AV女優,成人影片,色情A片,成人論壇,情趣,免費成人影片,成人電影,成人影城,愛情公寓,色情影片,保險套

  • qw, about 1 year later:

    Thanks so much for this! This is exactly what I was looking for

    mirc mırc mırç mirç mirc indir mirc yükle mirc yukle türkçe mirc mirc indir mirc islami sohbet kelebek kelebek script kelebek sohbet kelebek mirc chat çet cet çet odaları sohbet kanalları sohbet odaları kameralı sohbet kameralı chat sohbet eğlence mirc sohbet odaları sevgili arkadaş arkadaş bul arkaraş ara oto araba şarkı sözleri astroloji ikinci el telefon gazete gazeteler günlük gazeteler marifetname bedava domain ücretsiz domain benimurl parça kontör parça kontör radyo dinle bedava blog ücretsiz blog

  • Thanks you, about 1 year later:

    Thanks you


    Sohbet Chat Konya Chat şarkı dinle haber güzel sözler Astroloji mirc CinsellikKurtlar vadisi pusu

  • , about 1 year later:

    Victorias Secret Victoria’s Secret Fashion show Victorias Secret Pink Victorias Secret Model Victorias Secret Credit Card Victorias Secret Coupon Code Victorias Secret Lingerie Victorias Secret Fashion Show 2005 Victorias Secret Fashion Show 2006 Victorias Secret Bra Victorias Secret Catalog Victorias Secret Pantie Victorias Secret Online Coupon Victorias Secret Fashion Show 2007 Victorias Secret Girl Free Shipping Victorias Secret Victorias Secret Home Victorias Secret Christmas Victoria’S Secret Pink Dog Victorias Secret Music Victorias Secret Semi Annual Sale Victorias Secret Jobs Victorias Secret Free Shipping Code Victorias Secret Shoes Victorias Secret Thong Victorias Secret Commercial Victorias Secret Promotional Code Victorias Secret Love Spell Victorias Secret Boots Victorias Secret Employment Victorias Secret Reviews Victorias Secret Jeans Victorias Secret Brasil Victorias Secret Bag

  • , about 1 year later:

    情人用品,情人用品性哥,情 人用品,情趣用品,視訊交友,視訊美女,視訊美女,視訊交友網,視訊聊天室,視訊聊天室,視訊 交友網,免費視訊聊天,辣妹視訊,辣妹視訊,情人視訊網

  • dd, about 1 year later:

    徵信社,案件討論,男女專區,法律諮詢,相關新聞,情趣用品,情趣用品,情趣精品,情趣用品,情趣用品,情趣用品,情趣用品,威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣

    威而柔,自慰套,自慰套,SM,充氣娃娃,充氣娃娃,潤滑液,飛機杯,按摩棒,跳蛋,性感睡衣,視訊交友90739,情人視訊網,情色交友,視訊交友,辣妹視訊,美女視訊,aio交友愛情館,情色論壇,成人論壇,免費視訊聊天,辣妹視訊,視訊交友網,美女視訊,視訊交友,成人視訊,情趣用品,成人聊天室,情趣,情趣,視訊聊天室,視訊聊天,視訊聊天室,情色視訊,情人視訊網,免費視訊聊天室,aio交友愛情館,色情遊戲,寄情築園小遊戲,情色文學,一葉情貼圖片區

  • jj, about 1 year later:

    :-)))) Very interesting! Thanks!!! phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex phone sex mootzie cosmology edvard munch humorous quotations hundredth monkey brain teasers jillian ann shakespeare quotations bride of frankenstein gettysburg address bill of rights van gogh bowling tips violin books eden prosper julia dreyfus violin bows chess download xslt aviation funny quotes xslt tips gothic abs self hypnosis gothic clothes monique olivia noda amanda roberts somethings happening bgreen68 bfire3 reldeve links psychology hypnosis phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex phonesex mootzie buffys bedroom blog the great adventure