我想使用 Cask、Puppet 和 Vagrant 自动安装 Emacs 包。
来源
https://github.com/mcandre/mcandre-ubuntu
重现步骤
我可以在 Mac 上的 Emacs 中手动执行此操作:
$ emacs
M-: (cask-install)
C-x C-c
这成功安装了我最喜欢的 cask 包,让我可以在我的 中使用它们.emacs
。
我也可以将其作为内联 bash 命令执行:
$ emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))"
我也可以在 Vagrant 中执行此操作:
$ vagrant ssh
vagrant@precise64$ emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))"
我甚至可以使用sudo
Vagrant 内部来执行此操作,这在以后会很有用,这样 Puppet 就不会将我的 Emacs 文件写为root
.
vagrant@precise64$ /usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))"
然而,当我尝试从 Puppet 脚本执行命令时exec { ... }
,由于某种原因,它失败了。
command => "/usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval \"(progn (require 'cask \\\"~/.cask/cask.el\\\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))\""
痕迹
debug: Puppet::Type::Package::ProviderApt: Executing '/usr/bin/apt-cache policy emacs24'
debug: Exec[cask](provider=posix): Executing '/usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))"'
debug: Executing '/usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))"'
err: /Stage[main]//Exec[cask]: Failed to call refresh: /usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval "(progn (require 'cask \"~/.cask/cask.el\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))" returned 1 instead of one of [0] at /tmp/vagrant-puppet-1/manifests/default.pp:210
我尝试暂时将命令简化为:
command => "/usr/bin/sudo -u vagrant /usr/bin/emacs -q --eval \"(kill-emacs)\""
但这也失败了。
更多背景信息
我正在为一个疯狂的开发环境编写 Vagrant 配置,其中包含许多编程语言和文本编辑器。我计划添加 D、Dart、Go、Rust 的软件包;并配置nano
R Studio 和可能还有 R Studio。由于我遇到了错误,所以我暂时将 Vagrant 设置保持在较小的规模:git、Vim 和 Emacs。
在为 Vim 进行 Puppet 配置时,我发现某些命令需要特殊的 shell 环境配置,例如确保设置HOME
为/home/vagrant
。我尝试使用 emacs 命令,但这还不够。
我甚至尝试将所有环境变量从普通 vagrant 用户 bash shell 提供给 emacs 命令,但这也不起作用。
热门问题
emacs -q --eval ...
Puppet/sudo 没有提供什么要求?- 我可以向 emacs 和/或 Puppet 提供更多选项,以使失败的命令打印更具体的错误消息吗?
眼镜
我在用着:
- 桶 0.5.2
- 我的 Mac 和 Vagrant 上的 Emacs 24
- Ubuntu Precise Pangolin 12.04 x64
- VirtualBox 4.3.6
- Vagrant 1.4.3
- Homebrew 0.9.5
- Mac OS X 10.9.1 Mavericks
但我很确定该错误是由于我对manifests/default.pp
Puppet 脚本的配置错误造成的,而不是软件堆栈中的任何错误。
转帖自Reddit。
答案1
根据 steckerhalter 的建议,我能够使用 从 Puppet 运行内联 Emacs Lisp 代码--batch
,这样就不再需要交互式用户 tty shell:
command => "/usr/bin/sudo -u vagrant /usr/bin/emacs -q --batch --eval \"(progn (require 'cask \\\"~/.cask/cask.el\\\") (cask-initialize) (setq save-abbrevs nil) (cask-install) (kill-emacs))\""