你如何将AppleScript脚本置于版本控制之下?

时间:2011-10-03 23:25:54

标签: git applescript

我想知道这是否是最佳解决方案:

  • .applescript文件置于版本控制
  • 创建安装脚本以使用osacompile
  • 编译文件

但是还有.scptd目录。或者我可以将.applescript.scpt文件置于版本控制下?

什么是最佳解决方案?

4 个答案:

答案 0 :(得分:25)

我喜欢@DanielTrebbien's solution,但是我希望人们为了使用我的github项目而实现它有点太复杂了。一个更简单的选项,只是让你看到差异中的文本更改是告诉diff进程使用osadecompile textconv。

添加到.gitattributes

*.scpt diff=scpt

添加到.git / config

[diff "scpt"]
  textconv = osadecompile
  binary=true

以下是来自 AppleScript-droplet github project

的示例差异
$ git diff
--- a/AppleScript-droplet.app/Contents/Resources/Scripts/main.scpt
+++ b/AppleScript-droplet.app/Contents/Resources/Scripts/main.scpt
@@ -1,3 +1,3 @@
-on open filelist
-       ## Set useTerminal to true to run the script in a terminal
-       set useTerminal to true
+on open file_list
+       ## Set use_terminal to true to run the script in a terminal
+       set use_terminal to true

非常感谢@DanielTrebbien的回答让我看到osadecompile。

答案 1 :(得分:17)

如果使用git,您可以使用filter driver透明地(1)反编译SCPT文件,以便只提交AppleScript源代码(称为“清理”二进制SCPT)和(2)重新编译回SCPT签出时(称为“涂抹”AppleScript源代码)。

首先将以下名为git-ascr-filter的shell脚本添加到/usr/local/bin

#!/bin/sh
if [ $# -ne 2 ]; then
    echo "Usage: $0 --clean/--smudge FILE">&2
    exit 1
else
    if [ "$1" = "--clean" ]; then
        osadecompile "$2" | sed 's/[[:space:]]*$//'
    elif [ "$1" = "--smudge" ]; then
        TMPFILE=`mktemp -t tempXXXXXX`
        if [ $? -ne 0 ]; then
            echo "Error: \`mktemp' failed to create a temporary file.">&2
            exit 3
        fi
        if ! mv "$TMPFILE" "$TMPFILE.scpt" ; then
            echo "Error: Failed to create a temporary SCPT file.">&2
            rm "$TMPFILE"
            exit 4
        fi
        TMPFILE="$TMPFILE.scpt"
        # Compile the AppleScript source on stdin.
        if ! osacompile -l AppleScript -o "$TMPFILE" ; then
            rm "$TMPFILE"
            exit 5
        fi
        cat "$TMPFILE" && rm "$TMPFILE"
    else
        echo "Error: Unknown mode '$1'">&2
        exit 2
    fi
fi

确保chmod a+x脚本。

运行以下命令配置'ascr'过滤器:

git config filter.ascr.clean "git-ascr-filter --clean %f"
git config filter.ascr.smudge "git-ascr-filter --smudge %f"

然后添加到.gitattributes

*.scpt filter=ascr

现在每当您对SCPT文件进行更改并git add时,反编译的AppleScript源将被暂存而不是二进制SCPT。此外,每当您签出一个SCPT文件(实际存储为存储库中的AppleScript blob)时,都会在磁盘上重新创建SCPT文件。

答案 2 :(得分:6)

我总是把.applescript(纯文本文件)放在版本控制中(SVN)。通过这种方式,我可以轻松地在不同版本之间进行比较,对于多用户来说也很容易。您可以突出显示其他用户所做的更改。对于二进制文件,例如编译的脚本文件,这是不可能的。

答案 3 :(得分:2)

我将纯文本.applescript文件保存在Git中,并且我有一个简单的Bash脚本,每次我想构建应用程序时都会运行该脚本,它负责编译AppleScript。这是我的剧本:

#!/usr/bin/env bash

APPNAME="My Awesome App"

# make sure we're in the right place
if [ ! -d ".git" ]; then
    echo "ERROR: This script must be run from the root of the repository."
    exit
fi

# clear out old build
rm -r dist/*
mkdir -p "dist/$APPNAME.app/"

# copy files
cp -r app/* "dist/$APPNAME.app/"

# compile all applescript
cd "dist/$APPNAME.app/Contents/Resources/Scripts/"
for f in *.applescript
do
    osacompile -o "`basename -s .applescript "$f"`.scpt" "$f"
    rm "$f"
done

此脚本假定您的整个应用程序(即Contents/文件夹及其中的所有内容)位于Git存储库根目录中的文件夹app/内。它将所有内容复制到dist/中的应用程序的新副本,然后编译新副本的Contents/Resources/Scripts/文件夹中的所有AppleScript文件。

要自己使用,我建议将我的脚本复制到存储库根目录中的bin/build.sh,运行chmod +x bin/build.sh以使其可执行,然后随时运行./bin/build.sh您的应用的新版本。