As above example CMakeLists.txt executes, each function invocation adds "nodes" to a dependency graph. It also use this graph to generate CMake commands including `add_executable`, `add_dependencies`, `target_link_libraries`, and `add_test`.
### Using Package Manager For Go
Building Go binaries and libraries need to satisfy their dependencies, generally
we can do `go get ./...` to download and compile all external dependencies. The
problems are:
1. `go get` will always get the latest code from the default branch of the
remote repo, so changes of dependents might break the build. This is very
different with what we already have in `cmake/external` which download a
specific version or commit id of the dependency.
1. Some locations can not access external dependencies through the internet, as mentioned
in https://github.com/PaddlePaddle/Paddle/issues/2605. Using package management
tools can package the dependencies as a "vendor" package, which can be mirrored
at many cloud file hosting, so users what to compile paddle by themselves can
download this "vendor" package from a mirror site.
#### Choose A Suitable Tool
As mentioned by @wangkuiyi, [Here](https://github.com/golang/go/wiki/PackageManagementTools)
list dozens of Go package managers. We choose the tool using following principles:
- Most "active" projects with more stars, more pull requests or commits
- Widely used project
After comparing all these projects, we shall choose between the most popular
tools: Godep and Glide.
Here's a brief comparison between Godep and Glide
: https://github.com/Masterminds/glide/wiki/Go-Package-Manager-Comparison. There are
also many complaints about using `Godep`. There's also a new "official" pakcage
management tool has been started at: https://github.com/golang/dep to resolve
such problems, but it's currently at Alpha stage. So the best choice now is
glide obviously.
#### Manage Go Packages
- Dependencies: `go/glide.yaml` will store the dependencies and their versions which
is directly imported by paddle. `go/glide.lock` will store all dependencies recursively
with their commit id. Builds will "lock" to these packages if we don't `glide up`
them
- Vendor package: `go/vendor` directory will generated when running `cmake` command. `cmake`
will download the code corresponding to `go/glide.lock`. If we put a vendor folder
under `go/`, cmake will just check the commit id to the packages under the folder,
if commit id matches, there will be no download at all.
<spanid="implementation"></span><h1>Implementation<aclass="headerlink"href="#implementation"title="Permalink to this headline">¶</a></h1>
<p>As above example CMakeLists.txt executes, each function invocation adds “nodes” to a dependency graph. It also use this graph to generate CMake commands including <codeclass="docutils literal"><spanclass="pre">add_executable</span></code>, <codeclass="docutils literal"><spanclass="pre">add_dependencies</span></code>, <codeclass="docutils literal"><spanclass="pre">target_link_libraries</span></code>, and <codeclass="docutils literal"><spanclass="pre">add_test</span></code>.</p>
<spanid="using-package-manager-for-go"></span><h1>Using Package Manager For Go<aclass="headerlink"href="#using-package-manager-for-go"title="Permalink to this headline">¶</a></h1>
<p>Building Go binaries and libraries need to satisfy their dependencies, generally
we can do <codeclass="docutils literal"><spanclass="pre">go</span><spanclass="pre">get</span><spanclass="pre">./...</span></code> to download and compile all external dependencies. The
problems are:</p>
<olclass="simple">
<li><codeclass="docutils literal"><spanclass="pre">go</span><spanclass="pre">get</span></code> will always get the latest code from the default branch of the
remote repo, so changes of dependents might break the build. This is very
different with what we already have in <codeclass="docutils literal"><spanclass="pre">cmake/external</span></code> which download a
specific version or commit id of the dependency.</li>
<li>Some locations can not access external dependencies through the internet, as mentioned
in https://github.com/PaddlePaddle/Paddle/issues/2605. Using package management
tools can package the dependencies as a “vendor” package, which can be mirrored
at many cloud file hosting, so users what to compile paddle by themselves can
download this “vendor” package from a mirror site.</li>
</ol>
<divclass="section"id="choose-a-suitable-tool">
<spanid="choose-a-suitable-tool"></span><h2>Choose A Suitable Tool<aclass="headerlink"href="#choose-a-suitable-tool"title="Permalink to this headline">¶</a></h2>
<p>As mentioned by @wangkuiyi, <aclass="reference external"href="https://github.com/golang/go/wiki/PackageManagementTools">Here</a>
list dozens of Go package managers. We choose the tool using following principles:</p>
<ulclass="simple">
<li>Most “active” projects with more stars, more pull requests or commits</li>
<li>Widely used project</li>
</ul>
<p>After comparing all these projects, we shall choose between the most popular
tools: Godep and Glide.</p>
<p>Here’s a brief comparison between Godep and Glide
: https://github.com/Masterminds/glide/wiki/Go-Package-Manager-Comparison. There are
also many complaints about using <codeclass="docutils literal"><spanclass="pre">Godep</span></code>. There’s also a new “official” pakcage
management tool has been started at: https://github.com/golang/dep to resolve
such problems, but it’s currently at Alpha stage. So the best choice now is
glide obviously.</p>
</div>
<divclass="section"id="manage-go-packages">
<spanid="manage-go-packages"></span><h2>Manage Go Packages<aclass="headerlink"href="#manage-go-packages"title="Permalink to this headline">¶</a></h2>
<ulclass="simple">
<li>Dependencies: <codeclass="docutils literal"><spanclass="pre">go/glide.yaml</span></code> will store the dependencies and their versions which
is directly imported by paddle. <codeclass="docutils literal"><spanclass="pre">go/glide.lock</span></code> will store all dependencies recursively
with their commit id. Builds will “lock” to these packages if we don’t <codeclass="docutils literal"><spanclass="pre">glide</span><spanclass="pre">up</span></code>
them</li>
<li>Vendor package: <codeclass="docutils literal"><spanclass="pre">go/vendor</span></code> directory will generated when running <codeclass="docutils literal"><spanclass="pre">cmake</span></code> command. <codeclass="docutils literal"><spanclass="pre">cmake</span></code>
will download the code corresponding to <codeclass="docutils literal"><spanclass="pre">go/glide.lock</span></code>. If we put a vendor folder
under <codeclass="docutils literal"><spanclass="pre">go/</span></code>, cmake will just check the commit id to the packages under the folder,
if commit id matches, there will be no download at all.</li>
As above example CMakeLists.txt executes, each function invocation adds "nodes" to a dependency graph. It also use this graph to generate CMake commands including `add_executable`, `add_dependencies`, `target_link_libraries`, and `add_test`.
### Using Package Manager For Go
Building Go binaries and libraries need to satisfy their dependencies, generally
we can do `go get ./...` to download and compile all external dependencies. The
problems are:
1. `go get` will always get the latest code from the default branch of the
remote repo, so changes of dependents might break the build. This is very
different with what we already have in `cmake/external` which download a
specific version or commit id of the dependency.
1. Some locations can not access external dependencies through the internet, as mentioned
in https://github.com/PaddlePaddle/Paddle/issues/2605. Using package management
tools can package the dependencies as a "vendor" package, which can be mirrored
at many cloud file hosting, so users what to compile paddle by themselves can
download this "vendor" package from a mirror site.
#### Choose A Suitable Tool
As mentioned by @wangkuiyi, [Here](https://github.com/golang/go/wiki/PackageManagementTools)
list dozens of Go package managers. We choose the tool using following principles:
- Most "active" projects with more stars, more pull requests or commits
- Widely used project
After comparing all these projects, we shall choose between the most popular
tools: Godep and Glide.
Here's a brief comparison between Godep and Glide
: https://github.com/Masterminds/glide/wiki/Go-Package-Manager-Comparison. There are
also many complaints about using `Godep`. There's also a new "official" pakcage
management tool has been started at: https://github.com/golang/dep to resolve
such problems, but it's currently at Alpha stage. So the best choice now is
glide obviously.
#### Manage Go Packages
- Dependencies: `go/glide.yaml` will store the dependencies and their versions which
is directly imported by paddle. `go/glide.lock` will store all dependencies recursively
with their commit id. Builds will "lock" to these packages if we don't `glide up`
them
- Vendor package: `go/vendor` directory will generated when running `cmake` command. `cmake`
will download the code corresponding to `go/glide.lock`. If we put a vendor folder
under `go/`, cmake will just check the commit id to the packages under the folder,
if commit id matches, there will be no download at all.
<p>As above example CMakeLists.txt executes, each function invocation adds “nodes” to a dependency graph. It also use this graph to generate CMake commands including <codeclass="docutils literal"><spanclass="pre">add_executable</span></code>, <codeclass="docutils literal"><spanclass="pre">add_dependencies</span></code>, <codeclass="docutils literal"><spanclass="pre">target_link_libraries</span></code>, and <codeclass="docutils literal"><spanclass="pre">add_test</span></code>.</p>
<spanid="using-package-manager-for-go"></span><h1>Using Package Manager For Go<aclass="headerlink"href="#using-package-manager-for-go"title="永久链接至标题">¶</a></h1>
<p>Building Go binaries and libraries need to satisfy their dependencies, generally
we can do <codeclass="docutils literal"><spanclass="pre">go</span><spanclass="pre">get</span><spanclass="pre">./...</span></code> to download and compile all external dependencies. The
problems are:</p>
<olclass="simple">
<li><codeclass="docutils literal"><spanclass="pre">go</span><spanclass="pre">get</span></code> will always get the latest code from the default branch of the
remote repo, so changes of dependents might break the build. This is very
different with what we already have in <codeclass="docutils literal"><spanclass="pre">cmake/external</span></code> which download a
specific version or commit id of the dependency.</li>
<li>Some locations can not access external dependencies through the internet, as mentioned
in https://github.com/PaddlePaddle/Paddle/issues/2605. Using package management
tools can package the dependencies as a “vendor” package, which can be mirrored
at many cloud file hosting, so users what to compile paddle by themselves can
download this “vendor” package from a mirror site.</li>
</ol>
<divclass="section"id="choose-a-suitable-tool">
<spanid="choose-a-suitable-tool"></span><h2>Choose A Suitable Tool<aclass="headerlink"href="#choose-a-suitable-tool"title="永久链接至标题">¶</a></h2>
<p>As mentioned by @wangkuiyi, <aclass="reference external"href="https://github.com/golang/go/wiki/PackageManagementTools">Here</a>
list dozens of Go package managers. We choose the tool using following principles:</p>
<ulclass="simple">
<li>Most “active” projects with more stars, more pull requests or commits</li>
<li>Widely used project</li>
</ul>
<p>After comparing all these projects, we shall choose between the most popular
tools: Godep and Glide.</p>
<p>Here’s a brief comparison between Godep and Glide
: https://github.com/Masterminds/glide/wiki/Go-Package-Manager-Comparison. There are
also many complaints about using <codeclass="docutils literal"><spanclass="pre">Godep</span></code>. There’s also a new “official” pakcage
management tool has been started at: https://github.com/golang/dep to resolve
such problems, but it’s currently at Alpha stage. So the best choice now is
glide obviously.</p>
</div>
<divclass="section"id="manage-go-packages">
<spanid="manage-go-packages"></span><h2>Manage Go Packages<aclass="headerlink"href="#manage-go-packages"title="永久链接至标题">¶</a></h2>
<ulclass="simple">
<li>Dependencies: <codeclass="docutils literal"><spanclass="pre">go/glide.yaml</span></code> will store the dependencies and their versions which
is directly imported by paddle. <codeclass="docutils literal"><spanclass="pre">go/glide.lock</span></code> will store all dependencies recursively
with their commit id. Builds will “lock” to these packages if we don’t <codeclass="docutils literal"><spanclass="pre">glide</span><spanclass="pre">up</span></code>
them</li>
<li>Vendor package: <codeclass="docutils literal"><spanclass="pre">go/vendor</span></code> directory will generated when running <codeclass="docutils literal"><spanclass="pre">cmake</span></code> command. <codeclass="docutils literal"><spanclass="pre">cmake</span></code>
will download the code corresponding to <codeclass="docutils literal"><spanclass="pre">go/glide.lock</span></code>. If we put a vendor folder
under <codeclass="docutils literal"><spanclass="pre">go/</span></code>, cmake will just check the commit id to the packages under the folder,
if commit id matches, there will be no download at all.</li>