I am planning to develop a cross-platform script. On Linux and other operating systems, it will store configuration in XDG_CONFIG_HOME and data files (specifically, downloaded plugins) in XDG_DATA_HOME. On Windows, it will use APPDATA for both (unless someone has a better idea). However, what would be the proper thing to do on Mac OS X?
On my first glance through a handy Macbook's ~/Library directory, I saw Preferences and Application Support folders. I was originally planning to use those, but Preferences seems to just contain plists with reverse domain names like com.apple.foo.bar.baz.plist, and every folder in Application Support corresponds to a bundle in /Applications, so I'm not sure how well the system would react to files that don't match its standards. Storing them directly in ~/Library might be an option, but I don't want to pollute it with a stray myscript.conf file if there's a better place for it.
Where should I store these files? (And please don't say just ~/.myscript. I know it's the Unix tradition, but it annoys me to see random dotfiles in the home directory.)
I would use ~/Library/Application Support/script_name/. The subdirectories inside Application Support are used conventionally by various apps, including Apple's own softwares. But it's not enforced by the OS and not tied to apps inside /Applications. So you're perfectly free to create your own directory in it.
For the directory structure of OS X in general, see this Apple document.
Comparing Apple's documentation for the various paths to the XDG Base Directory specifications approximates to the following locations:
XDG_CONFIG_HOME▶︎~/Library/Preferences/XDG_DATA_HOME▶︎~/Library/XDG_CACHE_HOME▶︎~/Library/Caches/
Mapping XDG Base Directory Specification locations for "My App" on Mac OS X could look like this:
XDG_CONFIG_HOME▶︎~/Library/Preferences/name.often.with.domain.myapp.plistXDG_DATA_HOME▶︎~/Library/My App/XDG_CACHE_HOME▶︎~/Library/Caches/My App/
These mappings seem pretty reasonable but they aren't exact. Some kinds of cache or data may be appropriate for ~/Library/Application Support/My App, and other may be best in the temp locations or the App bundle. All of it is by convention and the same reasons for using the best XDG_ locations apply to using the best locations on the Mac OS X system.
Your annoyance at ~/.myscript is in line with Apple's guidelines: "Don't pollute user space".
References:
I agree with OJFord's comment: if you are writing a script, simply follow the XDG Base Directory would be better.
Rationales:
- Names in
XDG_CONFIG_HOMEare typically small-case bare-names likegit; the ones in~/Library/Preferences/are typically scoped with reversed domain names likecom.apple.foo-bar, or first-letter-capital space-delimited names likeFoo Bar. - GUI applications have been following macOS conventions when they are placed in
/Applications. You don't place your script in/Applications; you place them in UNIX-specific directorys. Better to be consistent. ~/Library/Preferences/is full of.plists. No cross-platform script that I know is using property lists.- Users may want to sync cross-platform configuration and macOS-only one separately.
For example, Git places their config file in XDG_CONFIG_HOME/git/config, not in ~/Library/Preferences/Git/config. Makes sense to me.
note
I made the point only for configuration files ($XDG_CONFIG_HOME) and data files ($XDG_DATA_HOME); for cache files it gets subtle. According to How-To Geek, ~/Library/Caches directory is excluded from Time Machine by default. I don’t care about cache folder since I back up neither directories anyway.
来源:https://stackoverflow.com/questions/3373948/equivalents-of-xdg-config-home-and-xdg-data-home-on-mac-os-x