私の知る限り、XCodeに日付を保持させる方法はありません。同様の問題に遭遇し、ディレクトリ内のファイルの変更日を (再帰的に) 含む plist ファイルを作成するシェル スクリプトを思いつきました。次に、それをバンドルに含め、ファイルをコピーして変更日を設定するときにそれを読み取ります。これを変更して、作成日またはアクセス日を処理したり、いくつかの作業を組み合わせたりすることができます。
これがbashスクリプトです:(私はまだbashに慣れていないので、それを改善する方法についてのコメントは大歓迎です)
#!/bin/bash
#First parameter is the folder to recurse into, defaults to current directory
#Second parameter is the full path to a pList file without the extension, defaults to
#<CURRENT DIRECTORY>/fileInfo
#if you don't specify /'s in the parameter it will be treated as a domain instead and
#the pList will be elsewhere...
pinfoLoc=${2:-`pwd`/fileInfo}
#Useful for debugging
#echo Source: ${1:-.}
#echo Destination: $pinfoLoc
for i in ${1:-.}/*; do
#Format: %Sa = last access, %Sm = last modified, %Sc = created
date=`stat -f "%Sm" $i`
#Uncomment below to see each file and date used
#echo $i - $date
#Write the data to the pList
defaults write $pinfoLoc "$i" -date "$date"
#Recurse into directories, not sure if there's a better way to do this
if [ -d "$i" ]; then
bash $0 $i $pinfoLoc
fi
done
基本的に、プロジェクトの外部に存在し、それにリンクされている「assets」というフォルダーがあり、XCode はそのフォルダーをバンドルにコピーします。バンドルからファイルをコピーした後に、各ファイルの変更日を更新するために思いついたコードを次に示します。
//Update file properties
NSString *file, *dstPath, *srcPath;
NSDictionary *fAttribs;
NSData *fInfoData = [fm contentsAtPath:[[NSBundle mainBundle] pathForResource:@"fileInfo" ofType:@"plist"]];
NSPropertyListFormat format;
NSDictionary *fileInfo = (NSDictionary *)[NSPropertyListSerialization
propertyListWithData:fInfoData
options:NSPropertyListMutableContainersAndLeaves
format:&format
error:&error];
NSString * resPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"assets"];
NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:resPath];
while (file = [dirEnum nextObject])
{
NSLog(@"Directory Enum File: %@", file);
dstPath = [NSString pathWithComponents:@[[appInfo appSupportPath], @"res", file ]];
srcPath = [@"assets" stringByAppendingPathComponent:file];
fAttribs = @{ NSFileModificationDate: [fileInfo valueForKey:srcPath]};
[fm setAttributes:fAttribs ofItemAtPath:dstPath error:&error];
if (error)
{
NSLog(@"Error setting attribute to file: %@ - %@", file, error.localizedDescription);
[error release];
error = nil;
}
}
これは私のファイルのコピー方法の後であり、見えない変数がいくつかあります。つまりfm
は のデフォルト マネージャでNSFileManager
あり、error
は初期化されていないNSError
で[appInfo appSupportPath]
あり、デバイス上のデータを保存するディレクトリを返す静的メソッドです (バンドルを変更できないため)。
また、日付を保持する plist の場所と、ファイルをコピーしたディレクトリをハードコーディングしました。後でコードで更新する予定です。
次に、スクリプトの実行を自動化し、fileInfo.plist も含めるように XCode をセットアップしました。後者は簡単です。スクリプトを実行したら、それを Xcode にドラッグ アンド ドロップして参照として保持できます。トリッキーな部分は、ビルドごとにスクリプトを実行することです。
- 上記の bash スクリプトをコピーしてファイルに貼り付けます
- Project Navigator でプロジェクトをクリックします。
- まだ選択されていない場合は、[ターゲット] でターゲット (アプリケーション名) を選択します。
- [ビルド フェーズ] タブをクリックします。
- 右下の [ビルド フェーズの追加] -> [実行スクリプトの追加] をクリックします。
- 新しいフェーズは最後になりますが、残念ながらそれは、生成しているファイルを含むファイルをバンドルにコピーした後です。そのため、フェーズを「バンドル リソースのコピー」のすぐ上にドラッグします。
- /bin/bash を入れたシェルの場合、/bin/sh も同様に機能する可能性があります...
以下の行にこれを入れます:
pushd $PROJECT_DIR/..
/PATH/TO/BASH/FILE/ABOVE.sh assets
popd
pushd $PROJECT_DIR/..
アセット ディレクトリは私のプロジェクトの 1 レベル上にあるため、これが必要でした。代わりに移動するディレクトリをハードコーディングすることもでき、おそらくより明確になるでしょう。
- 今すぐビルドしようとすると、スクリプト ファイルに実行権限がないため、おそらく権限エラーが発生します。ターミナルを開いて実行するよりも、Macでこれを設定する簡単な方法を知りません
chmod +x <BASH FILE NAME>
はい、誰もがそれを実行できることを理解しています. XCode が別のユーザーとしてビルドされているかどうか。
うまくいけば、これの少なくとも一部が役立ちます。この変更日を使用して、Web サーバーに新しいファイルがあるかどうかを確認し、必要なものだけをダウンロードします。