----- Mail original -----
De: "Mátyás Selmeci" 

Hi,

> This looks pretty cool!

Thanks for the feedback!

> One thing I notice in the limitations section of 
> your draft is a lot of "we can't do XXX due to lack of release 
> discipline..."

> Do you have any recommendations for Go programmers on how to structure 
> their software so that it is easy to package?

If there is an interest I can add a section on how to make a Go project easier 
to package, sure.

It won't be earth-shattering, just the Go declination of basic common sense 
rules that are needed in any coding language, that many Go projects already 
apply (unfortunately not all of them):

— do not change your import path every other month
— do not make your code accessible through multiple import paths
– only use smallcaps in your import path (I know some systems are case 
insensitive. Many others are NOT)
– communicate clearly the canonical import path of the project at the top of 
your README.md
— if you absolutely need to change your import path fix your code to use the 
new import path do not rely on http redirections
– that includes testing and example code
— do not add a .git suffix to your import path

— use _testdata for all the material needed by unit test
– put your example code in _examples (with subdirectories if you ship several 
examples). Do not use creative unusual names such as tutorial.
– do not pepper your subdirectories with .md files. Keep documentation in the 
project root or in a docs root subdirectory if there is too much of it
— add a one-line summary and a least a § describing what your project does at 
the top of your README.md

— choose licenses already vetted by Fedora or Debian 
https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses
– add a licensing file named LICENSE
— use unmodified plaintext canonical licensing texts, that state the LICENSE 
name at the top of the file
— if you absolutely want to add an extension to make Windows happy, use 
LICENSE.txt
— if you absolutely want to name your licensing file something else, please do 
not use something.md
— do not hide your licensing terms in README.md, do not refer to a license by 
name without providing its text

– do releases
— do releases, even for minor fixes. If you haven't felt the need to touch a 
project for months its latest state should be released!
— do releases, even for projects that can only be called through another 
project. Do not rely on this other project to set code state through vendoring 
(that's easy to do, just propagate the tip project version to the ancillary 
projects at release time, like kubernetes does)
– use semver for your releases https://semver.org/ Distributors and godep will 
thank you
– if your project is in git, use a different branch for every major version of 
your project
— if your project is in git, tag your release x.y.z as x.y.z, or vx.y.z, never 
as vx.y.zprettybeta. Versions and version tags are not the right place to 
document a project maturity.
— numbers are cheap, never reuse the same number for a pre-release and a final 
release, increase the minor version!
– please version your import paths with each major release (gopkg.in is good 
for that)

– use releases of the projects you depend on
— never depend on a project that already depends on you (otherwise software 
dependencies stop being a nice directed acyclic graph and you get into 
dependency loop hell. That's a nasic software engineering golden rule, not 
respecting it will bite you sooner or later with or without linux distros, 
despite vendoring)
– if for some reason, one of the projects you depend on does not release, 
please ask nicely it to do so
– if for some reason you need a code state in tip which is not in a release, 
please inform the origin you'd like it to do a release, and switch to this 
release as soon as it is available
– never depend on a commit state somewhere between two releases
— document the major versions of the stuff you depend on somewhere easy to 
find. If a major version is only usable past as specific minor version, 
document it
– add a unit test that detects if the project you depend on is missing the part 
that requires being after this minor version

– if your project provides wrappers, connexion glue or anything similar to many 
many many other projects keep the code for each other project in a separate 
subdirectory (Go package) so it can be desactivated without impacting the rest 
of your code if the other project ode has a problem.

— never add changes to the projects you reuse, submit the changes to those 
projects
— if you absolutely need to change a project you reuse, fork it cleanly with a 
new import path so distributors do not accidentally reinject the original 
project
— don't forget to rebase your code on the original project if you don't have 
the energy to maintain your own fork
– rebase to the latest minor version of every project you depend on at release 
time. Do not let changes accumulate till rebasing becomes a major endeavor.

— do not hide vendor subdirectories deep inside your project tree. Only use a 
toplevel directory
– identify clearly all the bits scrounged from other projects and not located 
in vendor in your README.md file
– if part of your project is generated code, document cleanly how to remove 
what you already generated and how to regenerate it from scratch

– put the code that needs to be built into a binary in cmd/binary-name

– do not test projects that depend on you from your project. Contribute the 
testing code to those projects (otherwise software dependencies stop being a 
nice directed acyclic graph and you get into dependency loop hell)
– do not ship not-working testing code (people will thing their build is broken)
— do not test that a project you depend on has a specific import path, it may 
rename itself in the future
– do not ship tests that depend on special parameters, go test should always 
just work
— do not ship tests that rely on being in a specific directory, as long as the 
test code in in GOPATH it should be testable regardless of the location
— do not ship tests that depend on specific timings, distributor build farms 
may be heavily loaded, causing the tests to fail.
– if a test depends on a special preparation, ship a shell script that 
describes this preparation. Do not rely on Ubuntu docker images.
– if a test depends on network access, make it fail gracefully when this access 
is blocked (with PASS not FAIL)
— never do go get from tests
— never stomp on GOPATH in tests

Anyway, you get the idea. This is probably not exhaustive, it needs to be 
maintained in a wiki page if people find it useful

Regards,

-- 
Nicolas Mailhot


_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org

Reply via email to