如何让 Mac 的 Ruby 使用 libreadline

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让 Mac 的 Ruby 使用 libreadline相关的知识,希望对你有一定的参考价值。

参考技术A 基于文本文档(Markdown) 设想好需要的基本需要的表、字段、类型;
使用 Rails Migration 随着功能的开发逐步创建表;
随着细节功能的开发、需求,逐步增加字段,删除字段,或者调整字段类型;
第一个 Release 的时候清理 Migrations 合并成一个;
随着后期的改动,逐步增加、修改、删除字段或表。
基本上我的所有项目都是这么搞的,这和项目是否复杂无关。
所以我前面为什么说思路需要转变。本回答被提问者和网友采纳

如何在 Mac OS 上使用 ruby​​ 设置文件创建时间?

【中文标题】如何在 Mac OS 上使用 ruby​​ 设置文件创建时间?【英文标题】:How can I set a file creation time with ruby on Mac OS? 【发布时间】:2012-01-15 13:50:22 【问题描述】:

我正在尝试使用 ruby​​ 脚本为 Mac OS 上的文件设置文件系统创建时间。

在 Mac OS X 上,'ctime' 代表最后一次 inode 修改时间,而不是文件创建时间,因此使用 ruby​​ 的 File.utime() 设置 ctime 无济于事。

使用这个提示 [http://inessential.com/2008/12/18/file_creation_date_in_ruby_on_macs] 我可以检索文件的创建时间:

Time.parse(`mdls -name kMDItemContentCreationDate -raw "#filename"`)

...但是知道如何使用 ruby​​ 设置它吗?

-- 更新--

好的,我想我可以实际上用 ruby​​ 中的 File.utime 做到这一点。

尽管 Mac OS 技术上不使用 ctime 来跟踪文件创建时间,但当您使用 utime 更新 ctime(连同 mtime,必须同时设置)文件系统似乎也神奇地根据kMDItemContentCreationDate更新创建时间。

所以要将 filename 设置为 2010 年 10 月 1 日的 ctime 和 2010 年 10 月 2 日的 mtime:

File.utime(Time.strptime('011010', '%d%m%y'), Time.strptime('021010', '%d%m%y'), filename)

【问题讨论】:

您可能希望发布您的“更新”解决方案作为答案,因此这个问题不需要保持开放(和“未回答”) 你明白这不是可移植的。 Linux 不支持存储创建时间。 ctime 也不是创建时间,它是根据目录“更改”时间,而不是文件本身。这可以解释它:***.com/a/4009369/128421 使用utime 设置文件时间不会改变使用mdls -name kMDItemContentCreationDate -raw 返回的值。 【参考方案1】:

有一个使用方法utime 的Ruby 解决方案。但是您必须一次设置修改时间 (mtime) 和访问时间 (atime)。如果你想保持访问时间,你可以使用:

File.utime(File.atime(path), modification_time, path)

参见Ruby core documentation。

【讨论】:

如果您在该文件上运行stat -s,您将看到这不会更新st_ctime 属性。【参考方案2】:

所以你肯定有一个纯 Ruby 解决方案可以工作,但由于这是 OS X,你反对exec()system() 并且只使用touch?在你的情况下,我几乎更喜欢:

system "touch -t YYYYMMDDhhmm /what/ever"

如果没有其他原因,只是为了清楚。

【讨论】:

touch 使用的机制与mdls -name kMDItemContentCreationDate -raw 不同。【参考方案3】:

这适用于我在 OS X 10.11.1 上更新创建时间:

system "SetFile -d '#time.strftime "%m/%d/%Y %H:%M:%S"' #file"

没有关于可移植性的声明 - SetFile 是一个 OS X 命令(并且手册页说它已被 XCode 6 弃用,因此可能无法工作很长时间) - 虽然找不到其他方法,Time.utime 没有'不更新创建时间,只更新修改和访问时间。

见:https://apple.stackexchange.com/q/99536/65787

【讨论】:

【参考方案4】:

Ruby 使用 utimes 系统调用来更改文件时间。

阅读 utimes 的手册页解释了会发生什么:

int utimes(const char *path, const struct timeval *times); .. 如果times不为NULL,则假定指向一个包含两个timeval的数组 结构。访问时间设置为第一个元素的值, 并且修改时间设置为第二个元素的值。为了 支持文件诞生(创建)时间的文件系统(如 UFS2), 如果第二个元素的出生时间将设置为第二个元素的值 元素早于当前设置的出生时间。设置两个出生 time和一个修改时间,需要两次调用;第一个设置 出生时间和第二个设置(可能是较新的)修改 时间。 ...

所以 ctime 只会及时向后更新。

【讨论】:

以上是关于如何让 Mac 的 Ruby 使用 libreadline的主要内容,如果未能解决你的问题,请参考以下文章

如何让 XAMPP 的 MySQL 和 Ruby on Rails 在我的 Mac 上协同工作?

如何快速正确的安装 Ruby,Rails 运行环境

ruby rails 安裝

mac下升级ruby环境版本

如何在 Mac OS 上使用 ruby​​ 设置文件创建时间?

Mac 上未识别 Ruby 版本