#### This Page

# `publish` (`target_url,` `credentials=None,` `**extra`)

- Method of Publisher
- New in Lektor Version 2.0

This method implements the actual publishing process. It's supposed to implement a generator that reports the progress of the publishing. If at any point something happens that would cause an error for the deployment this can be signalled with the fail method which aborts the execution and reports an error.

The parameters to the function are as follows:

- `target_url`: a URL object with the parsed URL. This object comes from the Werkzeug library and gives access to the individual parts of a URL by the exposed attributes (Read about the URL object).
- `credentials`: an optional dictionary with command line supplied credentials. Note that these credentials might be completely absent and the keys which are provided might change with future versions of Lektor.
- `**extra`: for forwards compatibility publishers are required to ignore extra keyword arguments.

Each line in the generator must be a string which is then either logged to the output in the console or in the deploy/publish window in the admin UI.

## Example

This example implements a simple publisher that just copies all built files into a new location.

    import os
    import shutil
    from lektor.publisher import Publisher

    class CopyPublisher(Publisher):

        def publish(self, target_url, credentials=None, **extra):
            src_path = self.output_path
            dst_path = target_url.path
            strip = len(src_path) + 1

            for path, folders, filenames in os.walk(src_path):
                # Ignore the .lektor folder.
                folders[:] = [x for x in folders if x != '.lektor']

                # Copy all files over
                for filename in filenames:
                    full_path = os.path.join(src_path, path, filename)
                    dst = os.path.join(path, full_path[strip:])

                    # Make sure the destination folder exists.
                    try:
                        os.makedirs(os.path.dirname(dst))
                    except (OSError, IOError):
                        pass

                    # Copy the file
                    yield 'Copy %s' % filename
                    shutil.copy(full_path, dst)

            yield 'Done'

    class MyPlugin(Plugin):
        def on_setup_env(self, **extra):
            self.env.add_publisher('copy', CopyPublisher)

This publisher registers with the `copy` scheme and could be used like this:

    target_url = copy:///path/to/destination/folder

## Comments