def fetcher
      @fetcher ||=
        if source_type == :url && File.basename(source[:url], "?*").end_with?(*NetFetcher::ALL_EXTENSIONS)
          Fetcher.fetcher_class_for_source(source).new(manifest_entry, fetch_dir, build_dir)
        else
          Fetcher.fetcher_class_for_source(source).new(manifest_entry, project_dir, build_dir)
        end
    end
def fetcher
      @fetcher ||=
        if source_type == :url && File.basename(source[:url], "?*").end_with?(*NetFetcher::ALL_EXTENSIONS)
          Fetcher.fetcher_class_for_source(source).new(manifest_entry, fetch_dir, build_dir)
        else
          Fetcher.fetcher_class_for_source(source).new(manifest_entry, project_dir, build_dir)
        end
    end
The fetcher for this software

 This is where we handle all the crazy back-compat on relative_path.
 All fetchers in omnibus 4 use relative_path incorrectly. net_fetcher was
 the only one to use to sensibly, and even then only if fetch_dir was
 Config.source_dir and the source was an archive. Therefore, to not break
 everyone ever, we will still pass project_dir for all other fetchers.
 There is still one issue where other omnibus software (such as the
 appbundler dsl) currently assume that fetch_dir the same as source_dir.
 Therefore, we make one extra concession - when relative_path is set in a
 software definition to be the same as name (a very common scenario), we
 land the source into the fetch directory instead of project_dir. This
 is to avoid fiddling with the appbundler dsl until it gets sorted out.

 @return [Fetcher]