我正在使用chef
它来为 Windows 10 上的本地构建创建安装文件(例如,使用 ChefDK chef-client -z -o win10-setup
)。
我想使用cookbook_file
或remote_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.dll
为someplugin.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
同一个运行列表中有冲突的文件时会发生什么。
祝你好运。