Utiliser l'identifiant de groupes de l'application cible (plus flexible)
Prévoyez-vous de garder une seule copie de MyApp.app
sur l'ensemble du système?
Si c'est le cas, vous pouvez tirer parti de l'identifiant de groupe de MyApp.app
et laisser Launch Services gérer tous les détails pour vous.
Cette solution est plutôt flexible; vous pouvez mettre votre workflow Automator où vous voulez - il n'est pas nécessaire qu'il soit situé au même endroit que MyApp.app
, ni à un endroit fixe par rapport à celui-ci.
Étapes
Voici les étapes à suivre :
-
Ouvrez Terminal.app et exécutez la commande suivante :
osascript -e 'id of app "'"$(mdfind MyApp.app)"'"'
-
L'étape précédente aurait dû afficher une seule ligne en résultat. Notez ce que cette ligne indique (par ex. com.example.MyApp
).
-
Ouvrez votre workflow dans Automator.
-
Ajoutez une action Exécuter un script Shell avec le contenu :
open -b com.example.MyApp
-
Enregistrez le workflow Automator dans le dossier de votre choix - pas besoin de le placer à un emplacement fixe par rapport à MyApp.app
.
-
Exécutez le workflow Automator; cela devrait lancer MyApp.app
.
Explication
Services de lancement
Cette solution tire parti d'une partie de macOS appelée Launch Services, qui maintient une base de données système des applications et de leurs propriétés:
Chaque fois qu'une nouvelle application devient connue du système (par exemple lorsque l'utilisateur la fait glisser depuis un disque d'installation dans le dossier Applications), l'application est enregistrée auprès de Launch Services, qui copie les informations nécessaires sur l'application dans sa base de données. Launch Services peut ensuite utiliser ces informations pour déterminer l'application préférée pour ouvrir un fichier de document ou une URL donnée.
Le plan
L'information qui nous intéresse est l'identifiant de groupe, ou bundle ID.
Un développeur d'applications attribue généralement à chacune de ses applications un identifiant de groupe (de préférence) globalement unique. Nous pouvons tirer parti de cette unicité uniquement s'il n'y a pas plus d'une seule application avec le même identifiant de groupe sur l'ensemble de notre système - et une seule copie de cette application. Pas de doublons.
Déterminer le chemin
La commande
mdfind MyApp.app
est simplement un moyen astucieux d'exécuter une recherche Spotlight en raccourci une fois pour déterminer le chemin de l'application à l'heure actuelle. Nous avons besoin du chemin une seule fois pour extraire l'identifiant de groupe de l'application.
Spotlight retournera (j'espère) quelque chose comme ceci :
/Users/watermelon/foo/MyApp.app
Extraction de CFBundleIdentifier
Placer le chemin actuel de l'application dans la commande AppleScript suivante :
id of app "/Users/watermelon/foo/MyApp.app"
est simplement un moyen pratique pour **extraire le CFBundleIdentifier
** du bundle MyApp.app
.
(Vous auriez également pu rechercher manuellement l'identifiant de groupe en cliquant avec le bouton droit sur l'application dans Finder, en choisissant Afficher le contenu du paquet, en naviguant jusqu'au sous-dossier Contenu
et en ouvrant Contenu/Info.plist
dans TextEdit, en recherchant la clé qui indique CFBundleIdentifier
et en trouvant sa valeur String
une ligne plus bas. Je trouve cela fastidieux, c'est pourquoi je préfère toujours utiliser le snippet AppleScript/mdfind
.)
Lancement d'une application par identifiant de groupe
Enfin, regardons la commande que vous allez réellement utiliser dans votre workflow Automator :
open -b com.example.MyApp
Cette commande est simplement une façon technique de dire "Hey macOS, tu es bon ami avec launchd
, non? Peux-tu le faire lancer cette application pour moi? Ah, au fait, je n'ai jamais pris la peine de rechercher le chemin complet. Ce que je sais en revanche, c'est son CFBundleIdentifier
, qui est com.example.MyApp
; demande à Launch Services et ils trouveront le chemin."
1 votes
À partir de macOS 10.12, Automator.app est toujours situé dans
/Applications
et protégé par SIP. Vous pouvez vérifier cela en exécutantgrep Automator /System/Library/Sandbox/rootless.conf
, ouls -ldAO@ /Applications/Automator.app
. Alors pourquoi ne pas simplement coder en dur/Applications
?0 votes
Désolé, ce n'est pas ce que je souhaite réaliser. je me rends compte de l'ambiguïté de mon message initial et l'ai modifié pour plus de clarté. je veux exécuter myapp.app -arguments de n'importe où en ouvrant simplement l'automator.app/workflow
0 votes
Si je comprends correctement la question, votre flux de travail nécessiterait de copier myapp.app (ou du moins un alias) vers le chemin actuel. Habituellement, c'est l'inverse qui est fait : le chemin actuel (par exemple un fichier/dossier) est transmis à l'application sous forme d'un argument. pwd ou ls ne seront pas copiés dans $pwd pour obtenir le répertoire de travail actuel ou une liste de contenu mais resteront dans /bin!
0 votes
@pastèque Merci d'avoir clarifié et édité votre question; bien que je pense que nous avons encore besoin de plus d'informations pour comprendre vos besoins. Il serait utile que vous éditiez à nouveau votre question et fournissiez un exemple autonome. Voir mon prochain commentaire pour ce que je pense être jusqu'à présent de vos besoins. Je pourrais être complètement dans l'erreur, et peut-être que je comprends mal votre exigence; cependant si tel est le cas, je vous recommanderais de fournir un exemple court et autonome pour plus de clarté.
1 votes
Ma compréhension : vous commencez avec un répertoire
~/foo
et une application~/foo/MyApp.app
. Votre objectif est d'avoir un flux de travail Automator pour servir de compagnon àMyApp.app
, et qui réside dans le même répertoire queMyApp.app
en tout temps. Vous souhaitez pouvoir déplacerMyApp.app
à votre guise, dans n'importe quel dossier, par exemple~/bar
– tant que le flux de travail compagnon voyage avec lui. Enfin, vous voulez pouvoir lancer le flux de travail compagnon depuis n'importe quel endroit, par exemple depuis le Finder, ou en utilisantopen ~/bar/MyWorkflow.workflow
lorsque vous êtes dans/tmp/meow
. C'est bien ça ?0 votes
@Synoli, vous semblez avoir une interprétation correcte :) Tant que l'application
Buddy.app
recherche l'applicationMyApp.app
à un emplacement relatif, elles peuvent être déplacées ensemble et continuer à fonctionner correctement. J'ai de nouveau édité mon message initial.