docs: def metatab_derived_handler(m):
      """Create local Zip, Excel and Filesystem packages
  
      :param m:
      :param skip_if_exists:
      :return:
      """
      from metapack.exc import PackageError
      from metapack.util import get_materialized_data_cache
      from shutil import rmtree
  
      create_list = []
      url = None
  
      doc = MetapackDoc(m.mt_file)
  
      env = get_lib_module_dict(doc)
  
      package_dir = m.package_root
  
      if m.args.package_directory:
          # If this is set, the FS package will be built to m.package_root, but the
          # file packages will be built to package_dir
          package_dir = parse_app_url(m.args.package_directory)
  
      update_name(m.mt_file, fail_on_missing=False, report_unchanged=False)
  
      process_schemas(m.mt_file, cache=m.cache, clean=m.args.clean, report_found=False)
  
      nv_name = m.args.nonversion_name
      nv_link = m.args.nonversion_link
  
      # Remove any data that may have been cached , for instance, from Jupyter notebooks
      rmtree(get_materialized_data_cache(doc), ignore_errors=True)
  
      reuse_resources=m.args.reuse_resources
  
      try:
  
          # Always create a filesystem package before ZIP or Excel, so we can use it as a source for
          # data for the other packages. This means that Transform processes and programs only need
          # to be run once.
  
          _, url, created = make_filesystem_package(m.mt_file, m.package_root, m.cache, env, m.args.force, False,
                                                    nv_link, reuse_resources=reuse_resources)
          create_list.append(('fs', url, created))
  
          lb_path = Path( m.package_root.fspath,'last_build')
  
          if created or not lb_path.exists():
              Path( m.package_root.fspath,'last_build').touch()
  
          m.mt_file = url
  
          env = {}  # Don't need it anymore, since no more programs will be run.
  
          if m.args.excel is not False:
              _, url, created = make_excel_package(m.mt_file, package_dir, m.cache, env, m.args.force, nv_name, nv_link)
              create_list.append(('xlsx', url, created))
  
          if m.args.zip is not False:
              _, url, created = make_zip_package(m.mt_file, package_dir, m.cache, env, m.args.force, nv_name, nv_link)
              create_list.append(('zip', url, created))
  
          if m.args.csv is not False:
              _, url, created = make_csv_package(m.mt_file, package_dir, m.cache, env, m.args.force, nv_name, nv_link)
              create_list.append(('csv', url, created))
  
      except PackageError as e:
          err("Failed to generate package: {}".format(e))
  
      index_packages(m)
  
      return create_list