105 lines
2.2 KiB
Markdown
105 lines
2.2 KiB
Markdown
![]() |
FileSystem
|
||
|
=========
|
||
|
|
||
|
A file change watcher wrapper based on [fs](https://github.com/synrc/fs)
|
||
|
|
||
|
## System Support
|
||
|
|
||
|
- Mac fsevent
|
||
|
- Linux, FreeBSD and OpenBSD inotify
|
||
|
- Windows inotify-win
|
||
|
|
||
|
NOTE:
|
||
|
|
||
|
On Linux, FreeBSD and OpenBSD you need to install inotify-tools.
|
||
|
On Macos 10.14, you need run `open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg` to compile `mac_listener`.
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
Put `file_system` in the `deps` and `application` part of your mix.exs
|
||
|
|
||
|
``` elixir
|
||
|
defmodule Excellent.Mixfile do
|
||
|
use Mix.Project
|
||
|
|
||
|
def project do
|
||
|
...
|
||
|
end
|
||
|
|
||
|
defp deps do
|
||
|
[
|
||
|
{ :file_system, "~> 0.2", only: :test },
|
||
|
]
|
||
|
end
|
||
|
...
|
||
|
end
|
||
|
```
|
||
|
|
||
|
|
||
|
### Subscription API
|
||
|
|
||
|
You can spawn a worker and subscribe to events from it:
|
||
|
|
||
|
```elixir
|
||
|
{:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"])
|
||
|
FileSystem.subscribe(pid)
|
||
|
```
|
||
|
|
||
|
or
|
||
|
|
||
|
```elixir
|
||
|
{:ok, pid} = FileSystem.start_link(dirs: ["/path/to/some/files"], name: :my_monitor_name)
|
||
|
FileSystem.subscribe(:my_monitor_name)
|
||
|
```
|
||
|
|
||
|
The pid you subscribed from will now receive messages like
|
||
|
|
||
|
```
|
||
|
{:file_event, worker_pid, {file_path, events}}
|
||
|
```
|
||
|
and
|
||
|
```
|
||
|
{:file_event, worker_pid, :stop}
|
||
|
```
|
||
|
|
||
|
### Example with GenServer
|
||
|
|
||
|
```elixir
|
||
|
defmodule Watcher do
|
||
|
use GenServer
|
||
|
|
||
|
def start_link(args) do
|
||
|
GenServer.start_link(__MODULE__, args)
|
||
|
end
|
||
|
|
||
|
def init(args) do
|
||
|
{:ok, watcher_pid} = FileSystem.start_link(args)
|
||
|
FileSystem.subscribe(watcher_pid)
|
||
|
{:ok, %{watcher_pid: watcher_pid}}
|
||
|
end
|
||
|
|
||
|
def handle_info({:file_event, watcher_pid, {path, events}}, %{watcher_pid: watcher_pid}=state) do
|
||
|
# YOUR OWN LOGIC FOR PATH AND EVENTS
|
||
|
{:noreply, state}
|
||
|
end
|
||
|
|
||
|
def handle_info({:file_event, watcher_pid, :stop}, %{watcher_pid: watcher_pid}=state) do
|
||
|
# YOUR OWN LOGIC WHEN MONITOR STOP
|
||
|
{:noreply, state}
|
||
|
end
|
||
|
end
|
||
|
```
|
||
|
|
||
|
|
||
|
## Tweaking behaviour via extra arguments
|
||
|
|
||
|
For each platform, you can pass extra arguments to the underlying listener process.
|
||
|
|
||
|
Each backend support different extra arguments, check backend module documentation for more information.
|
||
|
|
||
|
Here is an example to get instant notifications on file changes for Mac OS X:
|
||
|
|
||
|
```elixir
|
||
|
FileSystem.start_link(dirs: ["/path/to/some/files"], latency: 0, watch_root: true)
|
||
|
```
|