从 Puppet 运行“emacs --eval”时出现问题

从 Puppet 运行“emacs --eval”时出现问题

我想使用 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))"

我甚至可以使用sudoVagrant 内部来执行此操作,这在以后会很有用,这样 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 的软件包;并配置nanoR 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.ppPuppet 脚本的配置错误造成的,而不是软件堆栈中的任何错误。

转帖自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))\""

相关内容