<html devsite>
<head>
  <meta name="project_path" value="/_project.yaml">
  <meta name="book_path" value="/versions/8.4.0/_book.yaml">
</head>
<body>

<h1 class="page-title" id="modules.FilesToRunProvider">FilesToRunProvider</h1>

{% dynamic setvar source_file "src/main/java/com/google/devtools/build/lib/starlarkbuildapi/FilesToRunProviderApi.java" %}
{% dynamic setvar version "8.4.0" %}
{% dynamic setvar original_path "/rules/lib/providers/FilesToRunProvider" %}
{% include "_buttons.html" %}
<!-- {% raw %} -->



<h2>Members</h2>
<ul>
    <li>
    <a href="#executable">executable</a>
  </li>
      <li>
    <a href="#repo_mapping_manifest">repo_mapping_manifest</a>
  </li>
      <li>
    <a href="#runfiles_manifest">runfiles_manifest</a>
  </li>
  </ul>

      <h2 id="executable">executable</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/File.html">File</a> FilesToRunProvider.executable</pre></p>

    The main executable or None if it does not exist.

         May return <code>None</code>.

        <h2 id="repo_mapping_manifest">repo_mapping_manifest</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/File.html">File</a> FilesToRunProvider.repo_mapping_manifest</pre></p>

    The repo mapping manifest or None if it does not exist.

         May return <code>None</code>.

        <h2 id="runfiles_manifest">runfiles_manifest</h2>
        <p><pre class="rule-signature"><a class="anchor" href="../builtins/File.html">File</a> FilesToRunProvider.runfiles_manifest</pre></p>

    The runfiles manifest or None if it does not exist.

         May return <code>None</code>.


</body>
</html>

<!-- {% endraw %} -->
