fix(bundler) expose environment variables to GUI apps on linux and mac (#441)

* feat(bunder) bootstrapps zshrc and bashrc too

* feat(bundle) add bootstrapper to deb

* fix(linux): find linux path in bootstrapper

Co-authored-by: nothingismagick <drthompsonsmagickindustries@gmail.com>
This commit is contained in:
Lucas Fernandes Nogueira 2020-02-21 11:22:13 -03:00 committed by GitHub
parent 0b5b33bfaf
commit 9fd15a8bd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 4 deletions

View File

@ -29,6 +29,7 @@ use libflate::gzip;
use md5;
use tar;
use walkdir::WalkDir;
use std::process::{Command, Stdio};
use std::collections::BTreeSet;
use std::convert::TryInto;
@ -89,7 +90,8 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
pub fn generate_folders(settings: &Settings, package_dir: &Path) -> crate::Result<PathBuf> {
// Generate data files.
let data_dir = package_dir.join("data");
let binary_dest = data_dir.join("usr/bin").join(settings.binary_name());
let bin_name = settings.binary_name();
let binary_dest = data_dir.join("usr/bin").join(bin_name);
let bin_dir = data_dir.join("usr/bin");
common::copy_file(settings.binary_path(), &binary_dest)
@ -103,6 +105,62 @@ pub fn generate_folders(settings: &Settings, package_dir: &Path) -> crate::Resul
generate_icon_files(settings, &data_dir).chain_err(|| "Failed to create icon files")?;
generate_desktop_file(settings, &data_dir).chain_err(|| "Failed to create desktop file")?;
let bootstrap_file_name = format!("__{}-bootstrapper", bin_name);
let bootstrapper_file_path = bin_dir
.join(bootstrap_file_name.clone());
let bootstrapper_file = &mut common::create_file(&bootstrapper_file_path)?;
println!("{:?}", bootstrapper_file_path);
write!(
bootstrapper_file,
"#!/usr/bin/env sh
# This bootstraps the $PATH for Tauri, so environments are available.
export NVM_DIR=\"$([ -z \"${{XDG_CONFIG_HOME-}}\" ] && printf %s \"${{HOME}}/.nvm\" || printf %s \"${{XDG_CONFIG_HOME}}/nvm\")\"
[ -s \"$NVM_DIR/nvm.sh\" ] && . \"$NVM_DIR/nvm.sh\"
if [ -e ~/.bash_profile ]
then
source ~/.bash_profile
fi
if [ -e ~/.zprofile ]
then
source ~/.zprofile
fi
if [ -e ~/.profile ]
then
source ~/.profile
fi
if [ -e ~/.bashrc ]
then
source ~/.bashrc
fi
if [ -e ~/.zshrc ]
then
source ~/.zshrc
fi
echo $PATH
source /etc/profile
if pidof -x \"{}\" >/dev/null; then
exit 0
else
Exec=/usr/bin/env /usr/bin/{} $@ & disown
fi
exit 0
", bootstrap_file_name, bin_name
)?;
bootstrapper_file.flush()?;
Command::new("chmod")
.arg("+x")
.arg(bootstrap_file_name)
.current_dir(&bin_dir)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.spawn()
.expect("Failed to chmod script");
Ok(data_dir)
}
@ -124,7 +182,7 @@ fn generate_desktop_file(settings: &Settings, data_dir: &Path) -> crate::Result<
if !settings.short_description().is_empty() {
write!(file, "Comment={}\n", settings.short_description())?;
}
write!(file, "Exec={}\n", bin_name)?;
write!(file, "Exec=__{}-bootstrapper\n", bin_name)?;
write!(file, "Icon={}\n", bin_name)?;
write!(file, "Name={}\n", settings.bundle_name())?;
write!(file, "Terminal=false\n")?;

View File

@ -95,9 +95,29 @@ fn create_path_hook(bundle_dir: &Path, settings: &Settings) -> crate::Result<()>
"#!/usr/bin/env sh
# This bootstraps the $PATH for Tauri, so environments are available.
. ~/.bash_profile
if [ -e ~/.bash_profile ]
then
. ~/.bash_profile
fi
if [ -e ~/.zprofile ]
then
. ~/.zprofile
fi
if [ -e ~/.profile ]
then
. ~/.profile
fi
if [ -e ~/.bashrc ]
then
. ~/.bashrc
fi
if pidof -x \"__bootstrapper\" >/dev/null; then
if [ -e ~/.zshrc ]
then
. ~/.zshrc
fi
if pidof \"__bootstrapper\" >/dev/null; then
exit 0
else
exec \"`dirname \\\"$0\\\"`/{}\" $@ & disown