Vấn đề: thư mục .itmsp được hiển thị dưới dạng tệp
Finder tìm các thư mục .itmsp dưới dạng các gói , nghĩa là, như thể chúng là một tệp duy nhất. Ví dụ: trong chế độ xem cột, mọi thứ có trong thư mục .itmsp là vô hình, chỉ biểu tượng tài liệu được hiển thị:
Finder tìm thấy một thư mục là một gói nếu bất kỳ điều kiện nào sau đây là đúng (từ Hướng dẫn lập trình gói ):
Các thư mục có một phần mở rộng tên tập tin được biết: .app, .bundle, .framework, .plugin, .kext, và vân vân (theo quy định tại /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Đây là một plist nhị phân, mở nó với Xcode: open -a Xcode Info.plist
).
Thư mục có phần mở rộng mà một số yêu cầu ứng dụng khác đại diện cho loại gói (tìm com.apple.package
trong đầu ra của mdls -name kMDItemContentTypeTree <foldername>
để tìm hiểu.)
Thư mục có tập bit gói của nó (nếu GetFileInfo -ab <foldername>
trả về 1
, nó được đặt.)
Trường hợp 2. áp dụng cho các thư mục .itmsp: Application Loader.app
loại xuất com.apple.itunes-producer.itmsp
và đặt nó phù hợp với com.apple.package
:
$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
"com.apple.itunes-producer.itmsp",
"com.apple.package",
(...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
<string>public.composite-content</string>
</array>
<key>UTTypeDescription</key>
<string>iTunes Package</string>
<key>UTTypeIconFile</key>
<string>ITMSP.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
Một giải pháp: khai báo lại loại com.apple.itunes-producer.itmsp
Một giải pháp sẽ là khai báo lại loại com.apple.itunes-producer.itmsp
và phần mở rộng itmsp
dưới dạng thư mục và buộc Launch Services sử dụng khai báo loại đã sửa đổi.
Lưu ý quan trọng:
Mặc dù nó giải quyết được vấn đề của OP một cách đáng tin cậy, nhưng giải pháp được đề xuất, khi được áp dụng cho các gói khác, sẽ không hiển thị chúng dưới dạng các thư mục.
Tôi đã phát hiện ra rằng giải pháp được đề xuất dường như chỉ hoạt động với các loại tệp được khai báo bởi các ứng dụng nằm trong đường dẫn ứng dụng không chuẩn.
Đây là trường hợp với Application Loader.app
, được đặt tại /Applications/Xcode.app/Contents/Applications/
.
Nếu bạn quan tâm đến một giải pháp một phần, hãy kiểm tra phần cuối của câu trả lời này.
Để các thư mục .itmsp được hiển thị dưới dạng các thư mục của Finder, hãy làm theo các bước tiếp theo:
Mở Automator trong thư mục Ứng dụng và chọn Ứng dụng :
Chọn Tiện ích trong danh sách Thư viện, chọn Chạy Shell Script và kéo nó vào khung bên phải:
Thay thế nội dung tập lệnh mặc định bằng exit 0
:
Lưu ứng dụng dưới dạng itmspOpener:
Đóng máy tự động.
Chọn itmspOpener.app
và hiển thị nội dung của nó:
Xác định vị trí Nội dung> Info.plist và mở nó bằng trình chỉnh sửa yêu thích của bạn:
Thay thế các phần này trong Info.plist
:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>itmsp</string>
</array>
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeIconFile</key>
<string>folder</string>
<key>LSTypeIsPackage</key>
<false/>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
(...)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>kUTTypeDirectory</string>
</array>
<key>UTTypeDescription</key>
<string>itmsp folder</string>
<key>UTTypeIconFile</key>
<string>folder.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>itmsp</string>
</dict>
</dict>
</array>
Lưu ý:
Tại sao kUTTypeDirectory
thay vì public.directory
trong UTExportedTypeDeclarations
? Từ tài liệu của Apple : Quan trọng: Khi sử dụng UTCoreTypes.h
UTI do hệ thống xác định trong mã của bạn, bạn nên sử dụng các hằng số được xác định trong khung Dịch vụ khởi chạy khi khả dụng, thay vì các chuỗi UTI thực tế. Ví dụ: vượt qua kUTTypeApplication chứ không phải là com.apple.application. Các định danh loại thống nhất được khai báo theo hệ thống của hoàng tử liệt kê các hằng số này ngoài các chuỗi UTI.
Liên kết tệp .itmsp với itmspOpener
và nhấn nút Change All...:
Đặt lại cơ sở dữ liệu Dịch vụ khởi chạy:
$ lsregister -kill -r -domain local -domain system -domain user
(trên OS X 10.8 lsregister
nằm ở /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Tạo một thư mục .itmsp và liệt kê các thuộc tính của nó:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Vì cơ sở dữ liệu Launch Services đã được đặt lại, giờ đây Finder sẽ hiển thị các thư mục .itmsp dưới dạng thư mục.
Mở itmspOpener.app
để tải tập tin plist của nó và đăng ký com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Bắt đầu Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Thư mục foo3.itmsp
vẫn nên được hiển thị dưới dạng thư mục.
Kiểm tra lại các thuộc tính thư mục:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
không được thêm vào thuộc tính siêu dữ liệu của thư mục, đó là lý do tại sao Finder vẫn hiển thị các thư mục .itmsp dưới dạng thư mục!
Giải pháp tự động: hiển thị các thư mục .itmsp dưới dạng thư mục sau khi đăng nhập
Để hiển thị các thư mục .itmsp dưới dạng các thư mục sau khi đăng nhập:
Tạo itmspOpener.app
và sửa đổi nó Info.plist
như mô tả ở trên.
Tạo /usr/local/bin/itmspTypeLoader
với nội dung này (biến itmspOpener
chỉ đến vị trí itmspOpener.app
cư trú, thay đổi khi cần thiết):
#!/bin/bash
itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
echo "$(date): Starting" > /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
open $itmspOpener >> /tmp/itmspTypeLoader.log
sleep 1
echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
# Wait until process "Application Loader.app" exists
while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
sleep 1
echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
done
# Send TERM signal
kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
if [ $? -eq 0 ]; then
echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
else
echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
fi
echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log
Cả sleep 15
trước và sau khi chạy lsregister
đều có tầm quan trọng cao nhất. Nếu bạn không thấy kết quả mong muốn, hãy thử các độ trễ khác nhau.
Tạo /usr/local/bin/itmspTypeLoaderLauncher
với nội dung này:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Đặt cả hai tập lệnh thực thi:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Đặt /usr/local/bin/itmspTypeLoaderLauncher
làm móc đăng nhập :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Khởi động lại để thay đổi có hiệu lực. Sau khi đăng nhập, bạn sẽ thấy điều này:
và lsregister -dump
sẽ tiết lộ rằng itmspOpener.app
nó UTExportedTypeDeclarations
được ưu tiên hơn so Application Loader.app
với:
$ lsregister -dump | less
bundle id: 24748
path: /Users/jaume/Desktop/itmspOpener.app/
name: itmspOpener
(...)
flags: apple-internal relative-icon-path ui-element has-min-sys-version-by-arch hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app scriptable services x86_64
(...)
--------------------------------------------------------
type id: 33796
uti: com.apple.itunes-producer.itmsp
description: itmsp folder
flags: exported active apple-internal trusted
icon: Contents/Resources/folder.icns
conforms to: kuttypedirectory
tags: .itmsp
--------------------------------------------------------
(...)
bundle id: 24600
path: /Applications/Xcode.app/Contents/Applications/Application Loader.app/
name: Application Loader
(...)
flags: apple-internal relative-icon-path hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app i386 x86_64
(...)
--------------------------------------------------------
type id: 33832
uti: com.apple.itunes-producer.itmsp
description: iTunes Package
flags: exported inactive apple-internal trusted
icon: Contents/Resources/ITMSP.icns
conforms to: com.apple.package, public.composite-content
tags: .itmsp
--------------------------------------------------------
Bạn có thấy inactive
cờ được đặt trong kiểu xuất của Application Loader.app không? Chúng tôi đã đánh bại Trình tải ứng dụng.
Kiểm tra axit: các thư mục .itmsp vẫn hiển thị như vậy sau khi cập nhật iTunes
Gần đây tôi đã cập nhật Xcode:
và có thể xác nhận rằng các thư mục .itmsp đã được hiển thị dưới dạng các thư mục trong quá trình cập nhật:
và sau đó:
Giải pháp một phần: Gói sẽ hiển thị nội dung khi nhấp đúp
Như đã nhận xét trước đây, quy trình chi tiết ở trên sẽ không hoạt động với các thư mục tùy ý được Finder hiển thị dưới dạng các gói.
Tuy nhiên, nếu bạn chỉ muốn nhấp đúp vào gói để mở gói, có một cách để thực hiện với một bash
tập lệnh và Trình tự động:
Kịch bản tạo một thư mục tạm thời bị ẩn bên trong gói, hiển thị nó trong Finder (do đó tiết lộ gói dưới dạng thư mục) và sau đó xóa thư mục tạm thời.
Ghi chú:
Tập lệnh thay vào đó có thể tạo một tập tin tạm thời bị ẩn. Tuy nhiên, tôi thích tạo một thư mục vì rmdir
chỉ xóa các thư mục trống , trong khi rm
xóa bất kỳ tệp nào , vì vậy, nếu, vì một số lý do. kịch bản tàn phá, chỉ các thư mục trống sẽ bị xóa, điều này có thể không tệ như thể các tệp đã bị xóa.
Automator bó tập lệnh vào một ứng dụng sẽ được liên kết với các tệp gói.
Đây là các bước để tạo ra một ứng dụng như vậy. Tôi sẽ sử dụng các tệp .itmsp làm ví dụ về loại gói trong phần giải thích bên dưới:
Mở Automator trong thư mục Ứng dụng và chọn Ứng dụng :
Chọn Tiện ích trong danh sách Thư viện, chọn Chạy Shell Script và kéo nó vào khung bên phải:
Set đèo đầu vào để như các đối số :
Thay thế nội dung tập lệnh mặc định bằng:
for f in "$@"; do
# If not dealing with a directory, exit
if [ ! -d "$f" ]; then exit; fi
# Create a temporary directory inside the itmsp "file"
tmpdir="$f/.itmspOpener$$"
if mkdir $tmpdir; then
# Reveal in Finder
open -R $tmpdir
# Delete temporary file
rmdir $tmpdir
fi
done
Lưu ứng dụng dưới dạng itmspOpener:
Đóng máy tự động.
Bây giờ bạn có một ứng dụng có thể mở tệp .itmsp dưới dạng thư mục nếu được liên kết với nó.
Có một vấn đề thẩm mỹ: vì hiện tại, các tệp được liên kết sẽ có biểu tượng tài liệu trắng tiêu chuẩn:
Chúng ta cũng hãy sửa nó:
Hãy chắc chắn rằng Automator đã đóng.
Chọn itmspOpener và hiển thị nội dung của nó:
Xác định vị trí Nội dung> Info.plist và mở nó bằng trình chỉnh sửa yêu thích của bạn:
Thay thế giá trị cho khóa này trong CFBundleDocumentTypes
mảng:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
và thêm khóa này:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Bây giờ, phần này trông như thế này:
Chuyển sang Finder, chọn thư mục, nhấn ⌘I, chọn biểu tượng thư mục ở góc trên cùng bên trái và sao chép nó bằng ⌘C:
Mở Xem trước và chọn Tệp> Mới từ Clipboard. Lưu tệp dưới dạng folder.icns
:
Sao chép folder.icns
vào itmspOpener/Contents/Resources
:
Liên kết tệp .itmsp với itmspOpener
và nhấn nút Change All...:
Biểu tượng của các tệp .itmsp sẽ thay đổi thành một thư mục hoặc ít nhất tôi nghĩ vậy: thật không may, đây không phải là trường hợp. Vì vậy, tôi đã chuyển ứng dụng itmspOpener sang một vị trí khác (tôi đã tạo một thư mục tạm thời trên Bàn làm việc của mình, di chuyển nó đến đó và quay lại Bàn làm việc của tôi). Điều đó làm mới thông tin biểu tượng trong Finder:
Bây giờ, nhấp đúp vào tệp .itmsp và xem nó mở dưới dạng thư mục: