无法在 Windows 上的 Chef 中使用 cookbook_file 复制 .​​DLL 文件

无法在 Windows 上的 Chef 中使用 cookbook_file 复制 .​​DLL 文件

我正在使用chef它来为 Windows 10 上的本地构建创建安装文件(例如,使用 ChefDK chef-client -z -o win10-setup)。

我想使用cookbook_fileremote_directory复制*.dll我本地保存在菜谱中的文件。我发现,如果我的菜谱中有一个 .dll,chef 会抱怨它看不到该文件并抛出Chef::Exceptions::FileNotFound

例如,如果我有[cookbook]\files\default\notepadplusplus\plugins\someplugin.dll

然后尝试:

cookbook_file "#{ENV["USERPROFILE"]}\\AppData\\Roaming\\Notepad++\\plugins\\someplugin.dll" do
  source 'notepadplusplus/plugins/someplugin.dll'
  action :create_if_missing
  only_if { ::File.exist?("#{ENV["PROGRAMFILES"]}/Notepad++/notepad++.exe") }
end

它不会工作。但是,如果我重命名someplugin.dllsomeplugin.dll.plugin,然后将我的代码更改为以下内容,我会source相应地更新

cookbook_file "#{ENV["USERPROFILE"]}\\AppData\\Roaming\\Notepad++\\plugins\\someplugin.dll" do
  source 'notepadplusplus/plugins/someplugin.dll.plugin'
  action :create_if_missing
  only_if { ::File.exist?("#{ENV["PROGRAMFILES"]}/Notepad++/notepad++.exe") }
end

它会起作用。

但是,这不是一个理想的解决方案,因为我不想cookbook_file对每个文件单独执行此操作,而是remote_directory一次复制文件夹中的所有插件。

我进行了测试remote_directory,发现它会复制其他不存在的文件*.dll,但会跳过这些*.dll文件

我不想在复制文件后使用大量脚本来重命名文件,因为这似乎容易出错。

是否有任何特殊原因导致 chef 似乎认为.dll文件不存在或以某种方式配置为忽略这些文件?由于上述重命名技巧有效,它似乎根据实际文件扩展名进行过滤,而不是根据文件中的数据进行过滤。

答案1

虽然这个问题是一年前提出的,但我最近自己也遇到了这个问题,并找到了一个解决方案。回复是为了让其他偶然看到这篇文章的人有机会得到安慰。


检查您的chefignore食谱根目录中的文件是否不包含 .dll 文件的条目。如果您使用该chef generate cookbook [cookbook_name]命令(或者可能是等效的 knife 命令)创建了食谱,则可以预期您的chefignore文件包含此条目。

chefignore您要修改的文件中部分的示例:

## COMPILED ##
##############
a.out
*.o
*.pyc
*.so
*.com
*.class
*.dll
*.exe
*/rdoc/

您可以注释掉有问题的行,也可以将其完全删除。


在我的特定情况下,我只想在用于测试的嵌套食谱中使用 .dll。我的解决方案是将文件复制chefignore到嵌套食谱的根目录中,然后在那里修改文件。

内部食谱文件的示例路径chefignore

[outer_cookbook]\test\cookbooks\[inner_cookbook]\chefignore

请注意,内部食谱本身位于我的运行列表中,我不确定当chefignore同一个运行列表中有冲突的文件时会发生什么。

祝你好运。

相关内容