Allow overwriting any bundler option per OS (#1213)

This commit is contained in:
Wojtek Mach 2022-06-02 21:33:23 +02:00 committed by GitHub
parent fc7328703a
commit c9f022d637
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 130 additions and 58 deletions

View file

@ -38,16 +38,22 @@ defmodule WxDemo.MixProject do
name: "WxDemo",
url_schemes: ["wxdemo"],
document_types: [
%{
[
name: "WxDemo",
extensions: ["wxdemo"],
macos_role: "Editor"
}
macos: [
role: "Editor"
]
]
],
server: WxDemo,
macos_build_dmg: macos_notarization != nil,
macos_notarization: macos_notarization,
windows_build_installer: true
macos: [
build_dmg: macos_notarization != nil,
notarization: macos_notarization
],
windows: [
server: WxDemo,
build_installer: true
]
]
]
]

View file

@ -1,25 +1,8 @@
defmodule AppBuilder do
def bundle(release) do
os = os()
options = validate_options(release.options[:app])
allowed_options = [
:name,
:server,
icon_path: [
macos: Application.app_dir(:wx, "examples/demo/erlang.png")
],
url_schemes: [],
document_types: [],
additional_paths: [],
macos_is_agent_app: false,
macos_build_dmg: false,
macos_notarization: nil,
windows_build_installer: true
]
options = Keyword.validate!(release.options[:app], allowed_options)
case os do
case os() do
:macos ->
AppBuilder.MacOS.bundle(release, options)
@ -34,4 +17,72 @@ defmodule AppBuilder do
{:win32, _} -> :windows
end
end
defp validate_options(options) do
os = os()
root_allowed_options = %{
all: [
:name,
:icon_path,
url_schemes: [],
document_types: [],
additional_paths: []
],
macos: [
app_type: :regular,
build_dmg: false,
notarization: nil
],
windows: [
:server,
build_installer: false
]
}
document_type_allowed_options = %{
all: [
:name,
:extensions,
:icon_path
],
macos: [
:role
],
windows: []
}
options = validate_options(options, root_allowed_options, os)
Keyword.update!(options, :document_types, fn document_types ->
Enum.map(document_types, fn options ->
validate_options(options, document_type_allowed_options, os)
end)
end)
end
defp validate_options(options, allowed, os) do
{macos_options, options} = Keyword.pop(options, :macos, [])
{windows_options, options} = Keyword.pop(options, :windows, [])
options_per_os = %{
macos: macos_options,
windows: windows_options
}
options = Keyword.validate!(options, allowed.all)
options_for_os = Map.fetch!(options_per_os, os)
allowed_without_defaults =
for option <- allowed.all do
case option do
atom when is_atom(atom) -> atom
{atom, _default} when is_atom(atom) -> atom
end
end
allowed_for_os = allowed_without_defaults ++ Map.fetch!(allowed, os)
os_options = Keyword.validate!(options_for_os, allowed_for_os)
Keyword.merge(options, os_options)
end
end

View file

@ -33,13 +33,15 @@ defmodule AppBuilder.MacOS do
launcher_src_path
])
icon_path = Keyword.fetch!(options, :icon_path)
icon_path =
Keyword.get(options, :icon_path, Application.app_dir(:wx, "examples/demo/erlang.png"))
dest_path = "#{resources_path}/AppIcon.icns"
create_icon(icon_path, dest_path)
for type <- Keyword.fetch!(options, :document_types) do
if src_path = type[:icon_path] do
dest_path = "#{resources_path}/#{type.name}Icon.icns"
if src_path = Keyword.get(type, :icon_path, icon_path) do
dest_path = "#{resources_path}/#{type[:name]}Icon.icns"
create_icon(src_path, dest_path)
end
end

View file

@ -30,11 +30,15 @@ defmodule AppBuilder.Windows do
vcredist_path = ensure_vcredistx64()
copy_file(vcredist_path, "#{app_path}/vcredist_x64.exe")
create_icon(options[:icon_path], "#{app_path}/AppIcon.ico")
icon_path = options[:icon_path]
if icon_path do
create_icon(icon_path, "#{app_path}/AppIcon.ico")
end
for type <- Keyword.fetch!(options, :document_types) do
if src_path = type[:icon_path] do
dest_path = "#{app_path}/#{type.name}Icon.ico"
if src_path = Keyword.get(type, :icon_path, icon_path) do
dest_path = "#{app_path}/#{type[:name]}Icon.ico"
create_icon(src_path, dest_path)
end
end

View file

@ -41,25 +41,25 @@
<%= for type <- types do %>
<dict>
<key>CFBundleTypeName</key>
<string><%= type.name %></string>
<string><%= type[:name] %></string>
<key>CFBundleTypeRole</key>
<string><%= type.macos_role %></string>
<string><%= type[:role] %></string>
<key>CFBundleTypeExtensions</key>
<array>
<%= for ext <- type.extensions do %>
<%= for ext <- type[:extensions] do %>
<string><%= ext %></string>
<% end %>
</array>
<%= if type[:icon_path] do %>
<key>CFBundleTypeIconFile</key>
<string><%= type.name %>Icon</string>
<string><%= type[:name] %>Icon</string>
<% end %>
</dict>
<% end %>
</array>
<% end %>
<%= if @app_options[:macos_is_agent_app] do %>
<%= if @app_options[:app_type] == :agent do %>
<key>LSUIElement</key>
<true/>
<% end %>

View file

@ -23,7 +23,9 @@ RequestExecutionLevel admin
;Pages
;!insertmacro MUI_PAGE_COMPONENTS
<%= if @app_options[:icon_path] do %>
!define MUI_ICON "AppIcon.ico"
<% end %>
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
@ -46,18 +48,22 @@ Section "Install"
File /r rel rel
File "<%= app_name %>Launcher.vbs"
<%= if @app_options[:icon_path] do %>
File "AppIcon.ico"
<% end %>
CreateDirectory "$INSTDIR\Logs"
WriteUninstaller "$INSTDIR\<%= app_name %>Uninstall.exe"
<%= for type <- Keyword.fetch!(@app_options, :document_types) do %>
<%= for ext <- type.extensions do %>
WriteRegStr HKCR ".<%= ext %>" "" "<%= app_name %>.<%= type.name %>"
<%= for ext <- type[:extensions] do %>
WriteRegStr HKCR ".<%= ext %>" "" "<%= app_name %>.<%= type[:name] %>"
<% end %>
WriteRegStr HKCR "<%= app_name %>.<%= type.name %>" "" "<%= type.name %>"
WriteRegStr HKCR "<%= app_name %>.<%= type.name %>\DefaultIcon" "" "$INSTDIR\<%= type.name %>Icon.ico"
WriteRegStr HKCR "<%= app_name %>.<%= type.name %>\shell\open\command" "" '$WINDIR\system32\wscript.exe "$INSTDIR\<%= app_name %>Launcher.vbs" "open_file:%1"'
WriteRegStr HKCR "<%= app_name %>.<%= type[:name] %>" "" "<%= type[:name] %>"
<%= if type[:icon_path] || @app_options[:icon_path] do %>
WriteRegStr HKCR "<%= app_name %>.<%= type[:name] %>\DefaultIcon" "" "$INSTDIR\<%= type[:name] %>Icon.ico"
<% end %>
WriteRegStr HKCR "<%= app_name %>.<%= type[:name] %>\shell\open\command" "" '$WINDIR\system32\wscript.exe "$INSTDIR\<%= app_name %>Launcher.vbs" "open_file:%1"'
<% end %>
<%= for url_scheme <- Keyword.fetch!(@app_options, :url_schemes) do %>
@ -72,7 +78,7 @@ Section "Install"
SectionEnd
Section "Desktop Shortcut"
CreateShortCut "$DESKTOP\<%= app_name %>.lnk" "$INSTDIR\<%= app_name %>Launcher.vbs" "" "$INSTDIR\AppIcon.ico"
CreateShortCut "$DESKTOP\<%= app_name %>.lnk" "$INSTDIR\<%= app_name %>Launcher.vbs" "" <%= if @app_options[:icon_path] do %> "$INSTDIR\AppIcon.ico" <% end %>
SectionEnd
Section "Uninstall"

33
mix.exs
View file

@ -146,31 +146,34 @@ defmodule Livebook.MixProject do
],
app: [
name: "Livebook",
icon_path: [
macos: "rel/app/icon-macos.png",
windows: "rel/app/icon.ico"
],
url_schemes: ["livebook"],
document_types: [
%{
[
name: "LiveMarkdown",
extensions: ["livemd"],
icon_path: [
macos: "rel/app/icon.png",
windows: "rel/app/icon.ico"
macos: [
icon_path: "rel/app/icon.png",
role: "Editor"
],
macos_role: "Editor"
}
windows: [
icon_path: "rel/app/icon.ico"
]
]
],
additional_paths: [
"rel/erts-#{:erlang.system_info(:version)}/bin",
"rel/vendor/elixir/bin"
],
server: LivebookApp,
macos_is_agent_app: true,
macos_build_dmg: macos_notarization != nil,
macos_notarization: macos_notarization,
windows_build_installer: true
macos: [
icon_path: "rel/app/icon-macos.png",
build_dmg: macos_notarization != nil,
notarization: macos_notarization
],
windows: [
server: LivebookApp,
icon_path: "rel/app/icon.ico",
build_installer: true
]
]
]
]