2015-02-09 13 views
11

Piszę bibliotekę w Go. Mam zamiar go rozprowadzić z głównym wymaganiem "bez kodów źródłowych".Używanie pakietów binarnych bezpośrednio

Do testowania Utworzono dwie przestrzenie robocze, takie jak następujące,

ws1

  • bin/
  • PKG/linux_amd64/lib.a
  • src/lib/src.go

WS2

  • bin/
  • pkg/
  • src/main/main.go

Mój pierwszy roboczy (WS1) jest rzeczywista manekin biblioteka, która ma kilka funkcji użytkowych. Drugi obszar roboczy (WS2) ma główną funkcję, która korzysta z pakietu (lib.a) z WS1.

Wszystko działało dobrze, dopóki nie usunę źródła z WS1. Jeśli usunąć /lib/src.go katalogu w WS1, otrzymuję następujący błąd podczas kompilacji odchodzenia,

main.go: 5: 2: nie można odnaleźć pakiet „lib” w żadnej z: /usr/local/gO/src/pkg/lib (od $ GOROOT) ../Testing/ws1/src/lib (z $ GOPATH)

powyższy komunikat wskazuje nam, że powinniśmy zachować źródło również pliki. Samych skompilowanych pakietów binarnych nie można używać bezpośrednio.

Bazując na kilku sugestiach w Internecie, możemy zachować niektóre fałszywe źródła o wartości znacznika czasu mniejszej niż znaczniki czasu pakietów binarnych. Ale to nie wydaje się być wykonalnym rozwiązaniem dla nas. Co się stanie, jeśli niestety zaktualizowany zostanie znacznik czasowy fałszywych źródeł?

Widziałem podobny problem omawiany tutaj, https://github.com/golang/go/issues/2775

moje pytania:

  1. dystrybucją źródeł nie jest jedyną możliwością w Golang?

  2. Dlaczego usługa Go nie zapewnia rezerwy na bezpośrednie korzystanie z plików ".a"?

  3. Jeśli przechowywanie źródła jest obowiązkowe dla Go, dlaczego ta mała rzecz to , której nie wymieniono nigdzie w Go? (lub) Czy coś tu brakuje?

Z góry dziękuję za pomoc!

Odpowiedz

10

Kompilator Go potrzebuje plików .a. Jeśli je wyślesz, każdy będzie mógł użyć twojego pakietu bez kodu źródłowego.

ALE użytkownicy będą mieli do wywołania kompilatora (np 6g, a nie narzędzie go) ręcznie. Jeśli dostarczy myfoo.a plik i obojętne źródłowy myfoo.go zawierający tylko package myfoo i datownik z myfoo.a jest nowszy niż myfoo.go (i postawił wszystko na swoim miejscu), można użyć narzędzia go.

Aktualizacja: Nowsza wersja narzędzia odchodzenia wykryć skasowanych plików i wymagają, aby wszystkie pliki (może być pusty) z odpowiednimi nazwami i starszych znaczników czasu w folderze src. Zarządzanie znacznikiem czasu nie powinno stanowić problemu.

Nie daj się nabrać, że narzędzie gojest Go: To jest martwe wygodne narzędzie do budowania, testowania, get, bez względu na kod Go, ale nie jest to ani język, ani kompilator ani łącznik.

BTW: Nie ma sensu nie dystrybuować źródeł.

+0

Dzięki Volker! Teraz rozumiem problem tutaj. Powód, dla którego naciskałem na "budowanie go", większość deweloperów i tak używa tego narzędzia do swoich projektów. –

+2

Heads up: ta sztuczka nie działa już od wersji 1.5, zobacz [ten problem z GitHubem] (https://github.com/golang/go/issues/12186). – tsuna

5

Binarne-tylko pakiety będą dostępne w go1.7 (sierpień 2016) - https://tip.golang.org/doc/go1.7

tym wydaniu dodano eksperymentalne, minimalne wsparcie dla programów budowlanych przy użyciu tylko binarne pakiety, pakiety dystrybuowane w postaci binarnej, bez odpowiedni kod źródłowy. Ta funkcja jest potrzebna w niektórych komercyjnych ustawieniach, ale nie ma być w pełni zintegrowana z resztą zestawu narzędzi. Na przykład narzędzia, które zakładają dostęp do kompletnego kodu źródłowego, nie będą działały z takimi pakietami, a nie ma planów wspierania takich pakietów w poleceniu "pobierz".

Wniosek dotyczy: https://github.com/golang/proposal/blob/master/design/2775-binary-only-packages.md, https://tip.golang.org/pkg/go/build/#hdr-Binary_Only_Packages zawiera więcej informacji o nowej funkcji.

2

Pakiety zawierające tylko pliki binarne są teraz obsługiwane w wersji 1.7.

Możesz dostarczyć tylko pliki .a i pliki fałszywych przejść bez kodu źródłowego, aby je teraz rozpowszechnić.

Oto detailed example and a script of Go1.7 binary package generator.

myframework/frameImplement.go

package myframework 

import "fmt" 

func Hello(name string) string { 
    return fmt.Sprintf("Hello, %s!", name) 
} 

main/main.go

package main 

import (
    "fmt" 
    "golang-binary-package-generator/myframework" 
) 

func main() { 
    fmt.Println(" start program ") 
    fmt.Println(" print program :", myframework.Hello("print something now")) 
} 

Jeśli chcę ukryć kod źródłowy mojego ramach regulacyjnych, tylko budować ją go build -i -o $GOPATH/pkg/framework.a, a następnie zmodyfikuj swój kod źródłowy na

//go:binary-only-package 

package framework 

//you can add function prototype here for go doc etc, but no necessary. 

, której możesz użyć mojego generatora pakietów binarnych (skrypt), aby ci pomóc.

+0

proszę podać przykładową odpowiedź tutaj, następnie referencje – Sachith

+0

@Sachith Thanks. –

Powiązane problemy