无效的gemspec,因为规范中使用了日期格式。

89

当我在Gemfile中使用Bundler(版本1.0.12)引入我制作的gem后,尝试像这样执行bundle或rake命令时:

$ rake

出现了以下错误信息:

Invalid gemspec in [/Users/zagzag/.rvm/gems/ruby-1.9.2-p180@foobar/specifications/myplugin-1.0.0.gemspec]: invalid date format in specification: "2011-04-21 00:00:00.000000000Z"

我使用的是最新的 Mac OS X(10.6.4),其中包括:

$ ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.4.0]

并且:

$ gem -v
Invalid gemspec in [/Users/zagzag/.rvm/gems/ruby-1.9.2-p180@foobar/specifications/myplugin-1.0.0.gemspec]: invalid date format in specification: "2011-04-21 00:00:00.000000000Z"
1.7.2

我真的不知道如何解决这个问题。谢谢任何想法。


我现在一直收到这些错误!!!你是怎么解决的?迄今为止两个答案都没有帮助... - Meltemi
大家建议的那个是只读文件。我该怎么改变它? - chhantyal
15个回答

143

以下是我解决“规范中无效的日期格式”错误的方法:

1.) 进入位于以下位置的specifications文件夹:

/usr/local/lib/ruby/gems/1.8/specifications/

2.) 找到引起问题的spec文件。

3.) 将 s.date = %q{2011-05-21 00:00:00.000000000Z} 更改为 s.date = %q{2011-05-21}

这对我来说是一个胜利!祝你好运。


太棒了,这个问题一直困扰着我! - David Archer
对我有用!我在安装了Ruby 1.8的Windows XP上使用时,em.websocket-0.3.2.gemspec在我尝试使用'livereload'(http://livereload.com/)时会抛出此错误。 - program247365
对我也起作用了,在Linux上的Chronic 1.6.4上。 - Gepsens
它解决了一个 gem 的问题,但是安装的其他 gem 可能会再次引起此错误。 - MickaelFM
2
这真让我发疯...我难道要修改50个第三方gem的gemspec吗?为什么他们还没有更新gemspec,一年已经过去了.. - oma
在我的 Mac Lion 10.7 上运行良好。 - Mantichora

60

以下是用于修复所有 gem 的命令:

perl -p -i -e 's/ 00:00:00.000000000Z//' ~/gems/specifications/*.gemspec

它将s.date = %q{2011-05-21 00:00:00.000000000Z}转换为s.date = %q{2011-05-21},并且应该可以解决你的问题。


在执行此操作之前,制作快速备份的好方法:git init . && git commit -am“backup” - troyt
为什么尝试更改日期格式时,它会说我没有权限这样做。该怎么办? - chhantyal
@chhantyal 你需要以sudo运行它。非常感谢!节省了我很多时间。 - Matt McClure

21

请注意Damian Nowak的评论。这些命令可能会破坏你的rubygems!

在Ubuntu 11.10上,以下方法解决了这个错误:

sudo gem install rubygems-update
sudo update_rubygems     

以下内容在一些系统上可能有效,但在基于Debian的系统上可能无效:

sudo gem update --system

太好了,也适用于Oneiric的最终版本。但是这似乎清除了所有手动安装的gem。 - zehrer
1
不要使用它。它搞乱了我的RubyGems。我不得不删除很多东西并恢复到仓库中的原始RubyGems。要么完全手动安装RubyGems,要么使用Ubuntu提供的RubyGems。或者,您可以在PPA中查找当前的RubyGems。(我希望我能撤销一个月前做出的+1) - Nowaker
1
@DamianNowak 很抱歉听到这个消息。我已经在答案中添加了一个警告! - Mark

14

您可能已经升级了gem。要修复此问题,您可以直接编辑gemspec文件 - 来源

2011-04-21 00:00:00.000000000Z

YYYY-MM-DD

或者升级你的Rails版本

sudo gem update rails

它会修复这个问题。


@Meltemi,它将位于“specifications”目录下。 这是我的“specifications”目录路径 - /home/sayuj/.rvm/gems/ruby-1.9.2-p180/specifications/ - Sayuj
+1 更新 Rails - 它确实修复了问题,尽管在开始时会抛出相同的警告,但它安装正确并且问题不再发生。 - Adam Davis

6
不需要指定时间,只需日期即可。 2011-04-21 应该可以正常使用。

Gem::Specification.new do |s| s.name = "myplugin" s.version = "1.0.0" s.platform = Gem::Platform::RUBY s.authors = ["..."] s.email = ["..."] s.homepage = "http://..." s.summary = %q{...} s.description = %q{...} s.rubyforge_project = "myplugin" s.files = git ls-files.split("\n") s.test_files = git ls-files -- {test,spec,features}/*.split("\n") s.require_paths = ["lib"] end - Zag zag..
感谢您的回答。我同意您的观点,但在myplugin.gemspec文件中没有使用任何日期或datetime。这个Gem是由Bundler自动生成的。我认为这个问题可能是由于Bundler或RVM引起的...这很奇怪。 - Zag zag..

4

除了Redmine使用自己的2.3.11版本的Rails,Rails 2.3.11无法与RubyGems >= 1.7.0兼容,而你提到的提交是在2011年5月19日,这是在1.7.0之后(2011年4月1日)。我猜在这种情况下,您需要编辑规范文件。 - Olivier 'Ölbaum' Scherler

3
这更像是对Ben Hall答案的评论,但似乎我还没有这个特权。更新gem似乎没有起作用,我想可能是由于错误的日期格式而无法加载gem。手动逐个更改日期太令人沮丧了,所以使用grep命令:
grep -i *.gemspec -e '.*s\.date.*=.*%q{\(....-..-..\) \(.*Z\)}

而对于sed:
sed -i -e 's/\(.*\)s\.date.*=.*%q{\(....-..-..\) \(.*Z\)}/\1s.date = %q\{\2}/p' ./*.gemspec

请注意自己的风险!! 我仍然是一个sed新手,但对我有效;)


2

在我的slicehost服务器上,规格文件夹位于不同的位置。这是路径:

/usr/lib/ruby/gems/1.8/specifications

提供的错误应该给出规格文件夹的路径。


2

散弹枪式解决方案:卸载所有的gems并重新运行bundler。

  1. gem list --no-version | xargs gem uninstall -aIx
  2. rm -i `rvm gemdir`/specifications/*.gemspec
  3. gem update --system
  4. gem install bundler
  5. bundle install

如果你使用 .rvmrc 文件,请注意运行第二行代码时,因为gemdir可能会产生额外的输出。 - Jared Beck

1

我一直有这个问题。更新Rubygems可以很好地解决它:

gem update --system

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接