From 79f8487d54f830336361a10bf62de742122a9c77 Mon Sep 17 00:00:00 2001 From: yiguo Date: Sat, 25 Apr 2026 17:42:49 +0800 Subject: [PATCH 1/4] support new Xray-core modification --- build/app/build.py | 5 +++ build/template/main.gotemplate | 6 ---- desktop_bin/run.go | 7 ++-- geo/count.go | 12 +++---- go.mod | 27 +++++++++------- go.sum | 58 ++++++++++++++++++++-------------- xray/ping.go | 2 +- xray/validation.go | 2 +- xray/xray.go | 40 +++-------------------- xray_wrapper.go | 44 +++++++------------------- 10 files changed, 83 insertions(+), 120 deletions(-) diff --git a/build/app/build.py b/build/app/build.py index 05bdba6f..47d3390a 100644 --- a/build/app/build.py +++ b/build/app/build.py @@ -35,6 +35,10 @@ def init_go_env(self): if ret.returncode != 0: raise Exception("go mod init failed") + # apply go mod replace to use local xray-core + with open("go.mod", "a") as f: + f.write("\nreplace github.com/xtls/xray-core => ../Xray-core\n") + ret = subprocess.run( [ "go", @@ -149,6 +153,7 @@ def build_desktop_bin(self): raise Exception(f"build_desktop_bin failed") def revert_go_env(self): + return os.chdir(self.lib_dir) self.clean_lib_files(["go.mod", "go.sum"]) ret = subprocess.run(["go", "mod", "init", LIBXRAY_MOD_NAME]) diff --git a/build/template/main.gotemplate b/build/template/main.gotemplate index 62644ca4..31fd8c43 100644 --- a/build/template/main.gotemplate +++ b/build/template/main.gotemplate @@ -88,9 +88,3 @@ func CGoStopXray() *C.char { func CGoXrayVersion() *C.char { return C.CString(XrayVersion()) } - -//export CGoBuildMphCache -func CGoBuildMphCache(base64Text *C.char) *C.char { - text := C.GoString(base64Text) - return C.CString(BuildMphCache(text)) -} diff --git a/desktop_bin/run.go b/desktop_bin/run.go index 2d89e29d..71440454 100644 --- a/desktop_bin/run.go +++ b/desktop_bin/run.go @@ -16,9 +16,8 @@ type runXrayConfig struct { Dns string `json:"dns,omitempty"` BindInterface string `json:"bindInterface,omitempty"` // xray - DatDir string `json:"datDir,omitempty"` - MphCachePath string `json:"mphCachePath,omitempty"` - ConfigPath string `json:"configPath,omitempty"` + DatDir string `json:"datDir,omitempty"` + ConfigPath string `json:"configPath,omitempty"` } func runXray(configPath string) error { @@ -32,7 +31,7 @@ func runXray(configPath string) error { return err } - err = xray.RunXray(config.DatDir, config.MphCachePath, config.ConfigPath) + err = xray.RunXray(config.DatDir, config.ConfigPath) if err != nil { return err } diff --git a/geo/count.go b/geo/count.go index e8579707..94b1d0fc 100644 --- a/geo/count.go +++ b/geo/count.go @@ -8,7 +8,7 @@ import ( "sort" "github.com/xtls/libxray/nodep" - "github.com/xtls/xray-core/app/router" + "github.com/xtls/xray-core/common/geodata" "google.golang.org/protobuf/proto" ) @@ -56,7 +56,7 @@ func countGeoSite(datDir string, name string) error { if err != nil { return err } - var geositeList router.GeoSiteList + var geositeList geodata.GeoSiteList if err := proto.Unmarshal(geositeBytes, &geositeList); err != nil { return err } @@ -66,13 +66,13 @@ func countGeoSite(datDir string, name string) error { var codes []*geoCountryCode for _, site := range geositeList.Entry { var siteCode geoCountryCode - siteCode.Code = site.CountryCode + siteCode.Code = site.Code siteCode.RuleCount = len(site.Domain) codes = append(codes, &siteCode) list.RuleCount += siteCode.RuleCount for _, domain := range site.Domain { for _, attribute := range domain.Attribute { - attr := fmt.Sprintf("%s@%s", site.CountryCode, attribute.Key) + attr := fmt.Sprintf("%s@%s", site.Code, attribute.Key) attrCode := findAttrCode(codes, attr) if attrCode == nil { var newCode geoCountryCode @@ -108,7 +108,7 @@ func countGeoIP(datDir string, name string) error { if err != nil { return err } - var geoipList router.GeoIPList + var geoipList geodata.GeoIPList if err := proto.Unmarshal(geoipBytes, &geoipList); err != nil { return err } @@ -118,7 +118,7 @@ func countGeoIP(datDir string, name string) error { var codes []*geoCountryCode for _, geoip := range geoipList.Entry { var code geoCountryCode - code.Code = geoip.CountryCode + code.Code = geoip.Code code.RuleCount = len(geoip.Cidr) codes = append(codes, &code) list.RuleCount += code.RuleCount diff --git a/go.mod b/go.mod index e0f5f583..1edc515f 100644 --- a/go.mod +++ b/go.mod @@ -2,17 +2,19 @@ module github.com/xtls/libxray go 1.26.2 +replace github.com/xtls/xray-core => ../Xray-core + require ( github.com/stretchr/testify v1.11.1 github.com/vishvananda/netlink v1.3.1 - github.com/xtls/xray-core v1.260327.0 + github.com/xtls/xray-core v0.0.0-00010101000000-000000000000 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/andybalholm/brotli v1.0.6 // indirect - github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22 // indirect + github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 // indirect @@ -23,7 +25,7 @@ require ( github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/miekg/dns v1.1.72 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pires/go-proxyproto v0.11.0 // indirect + github.com/pires/go-proxyproto v0.12.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.6.0 // indirect github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af // indirect @@ -32,19 +34,22 @@ require ( github.com/vishvananda/netns v0.0.5 // indirect github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect - golang.org/x/crypto v0.49.0 // indirect + golang.org/x/crypto v0.50.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mod v0.33.0 // indirect - golang.org/x/net v0.52.0 // indirect + golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/net v0.53.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.42.0 // indirect - golang.org/x/text v0.35.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect golang.org/x/time v0.12.0 // indirect - golang.org/x/tools v0.42.0 // indirect + golang.org/x/tools v0.44.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect - google.golang.org/grpc v1.79.3 // indirect + golang.zx2c4.com/wireguard/windows v0.6.1 // indirect + google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect + google.golang.org/grpc v1.80.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gvisor.dev/gvisor v0.0.0-20260122175437-89a5d21be8f0 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index a24b2d4c..cd782fe8 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22 h1:00ziBGnLWQEcR9LThDwvxOznJJquJ9bYUdmBFnawLMU= -github.com/apernet/quic-go v0.59.1-0.20260217092621-db4786c77a22/go.mod h1:Npbg8qBtAZlsAB3FWmqwlVh5jtVG6a4DlYsOylUpvzA= +github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6 h1:cbF95uMsQwCwAzH2i8+2lNO2TReoELLuqeeMfyBjFbY= +github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6/go.mod h1:Npbg8qBtAZlsAB3FWmqwlVh5jtVG6a4DlYsOylUpvzA= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= @@ -40,8 +40,8 @@ github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pires/go-proxyproto v0.11.0 h1:gUQpS85X/VJMdUsYyEgyn59uLJvGqPhJV5YvG68wXH4= -github.com/pires/go-proxyproto v0.11.0/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU= +github.com/pires/go-proxyproto v0.12.0 h1:TTCxD66dU898tahivkqc3hoceZp7P44FnorWyo9d5vM= +github.com/pires/go-proxyproto v0.12.0/go.mod h1:qUvfqUMEoX7T8g0q7TQLDnhMjdTrxnG0hvpMn+7ePNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= @@ -62,8 +62,6 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f h1:iy2JRioxmUpoJ3SzbFPyTxHZMbR/rSHP7dOOgYaq1O8= github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f/go.mod h1:DsJblcWDGt76+FVqBVwbwRhxyyNJsGV48gJLch0OOWI= -github.com/xtls/xray-core v1.260327.0 h1:g4TzxMwyPrxslZh6uD+FiG3lXKTrnNO+b4ky2OhogHE= -github.com/xtls/xray-core v1.260327.0/go.mod h1:OXMlhBloFry8mw0KwWLWLd3RQyXJzEYsCGlgsX36h60= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= @@ -80,36 +78,48 @@ go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= -golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= -golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= -golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= -golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= -golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= +golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b h1:Qt2eaXcZ8x20iAcoZ6AceeMMtnjuPHvC51KRCH1DKSQ= +golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b/go.mod h1:5Fu78lew5ucMXt8w2KYcwvxu2rkC/liHzUvaoiI+H/M= +golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= +golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= -golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= -golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= -golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= +golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= +golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb h1:whnFRlWMcXI9d+ZbWg+4sHnLp52d5yiIPUxMBSt4X9A= golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= -google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +golang.zx2c4.com/wireguard/windows v0.6.1 h1:XMaKojH1Hs/raMrmnir4n35nTvzvWj7NmSYzHn2F4qU= +golang.zx2c4.com/wireguard/windows v0.6.1/go.mod h1:04aqInu5GYuTFvMuDw/rKBAF7mHrltW/3rekpfbbZDM= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529 h1:QoMBg0moLIlB/eucPzc+ID5SgPZWuirtjAn3l8nW2Dg= +google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529/go.mod h1:EjLmDZ8liSLBrCTK5vP+bGIxRQHE3ovGvOI0CzGk1PI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 h1:sNrWoksmOyF5bvJUcnmbeAmQi8baNhqg5IWaI3llQqU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= +google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/xray/ping.go b/xray/ping.go index 1a4a0081..ff03b331 100644 --- a/xray/ping.go +++ b/xray/ping.go @@ -11,7 +11,7 @@ import ( // url means the website we use to test speed. "https://www.google.com" is a good choice for most cases. // proxy means the local http/socks5 proxy, like "socks5://[::1]:1080". func Ping(datDir string, configPath string, timeout int, url string, proxy string) (int64, error) { - InitEnv(datDir, "") + InitEnv(datDir) server, err := StartXray(configPath) if err != nil { return nodep.PingDelayError, err diff --git a/xray/validation.go b/xray/validation.go index d4b7b1df..e6e3f21e 100644 --- a/xray/validation.go +++ b/xray/validation.go @@ -4,7 +4,7 @@ package xray // datDir means the dir which geosite.dat and geoip.dat are in. // configPath means the config.json file path. func TestXray(datDir string, configPath string) error { - InitEnv(datDir, "") + InitEnv(datDir) server, err := StartXray(configPath) if err != nil { return err diff --git a/xray/xray.go b/xray/xray.go index da914782..03a949a8 100644 --- a/xray/xray.go +++ b/xray/xray.go @@ -9,8 +9,6 @@ import ( "github.com/xtls/xray-core/common/cmdarg" "github.com/xtls/xray-core/common/platform" "github.com/xtls/xray-core/core" - "github.com/xtls/xray-core/infra/conf/serial" - "github.com/xtls/xray-core/main/commands/base" _ "github.com/xtls/xray-core/main/distro/all" ) @@ -52,21 +50,16 @@ func SetTunFd(fd int32) { os.Setenv(platform.TunFdKey, strconv.Itoa(int(fd))) } -func InitEnv(datDir string, mphCachePath string) { +func InitEnv(datDir string) { os.Setenv(platform.AssetLocation, datDir) os.Setenv(platform.CertLocation, datDir) - - if mphCachePath != "" { - os.Setenv(platform.MphCachePath, mphCachePath) - } } // Run Xray instance. // datDir means the dir which geosite.dat and geoip.dat are in. -// mphCachePath means the path of mph cache file. leave it empty if you don't use mph cache. // configPath means the config.json file path. -func RunXray(datDir string, mphCachePath string, configPath string) (err error) { - InitEnv(datDir, mphCachePath) +func RunXray(datDir, configPath string) (err error) { + InitEnv(datDir) memory.InitForceFree() coreServer, err = StartXray(configPath) if err != nil { @@ -83,10 +76,9 @@ func RunXray(datDir string, mphCachePath string, configPath string) (err error) // Run Xray instance with JSON configuration string. // datDir means the dir which geosite.dat and geoip.dat are in. -// mphCachePath means the path of mph cache file. leave it empty if you don't use mph cache. // configJSON means the JSON configuration string. -func RunXrayFromJSON(datDir string, mphCachePath string, configJSON string) (err error) { - InitEnv(datDir, mphCachePath) +func RunXrayFromJSON(datDir, configJSON string) (err error) { + InitEnv(datDir) memory.InitForceFree() coreServer, err = StartXrayFromJSON(configJSON) if err != nil { @@ -118,25 +110,3 @@ func StopXray() error { func XrayVersion() string { return core.Version() } - -// https://github.com/XTLS/Xray-core/blob/main/main/commands/all/buildmphcache.go -func BuildMphCache(datDir string, mphCachePath string, configPath string) error { - InitEnv(datDir, "") - cf, err := os.Open(configPath) - if err != nil { - base.Fatalf("failed to open config file: %v", err) - } - defer cf.Close() - - config, err := serial.DecodeJSONConfig(cf) - if err != nil { - base.Fatalf("failed to decode config file: %v", err) - return err - } - - if err := config.BuildMPHCache(&mphCachePath); err != nil { - base.Fatalf("failed to build MPH cache: %v", err) - return err - } - return nil -} diff --git a/xray_wrapper.go b/xray_wrapper.go index e4e22e50..b5db084d 100644 --- a/xray_wrapper.go +++ b/xray_wrapper.go @@ -113,23 +113,20 @@ func TestXray(base64Text string) string { } type RunXrayRequest struct { - DatDir string `json:"datDir,omitempty"` - MphCachePath string `json:"mphCachePath,omitempty"` - ConfigPath string `json:"configPath,omitempty"` + DatDir string `json:"datDir,omitempty"` + ConfigPath string `json:"configPath,omitempty"` } type RunXrayFromJSONRequest struct { - DatDir string `json:"datDir,omitempty"` - MphCachePath string `json:"mphCachePath,omitempty"` - ConfigJSON string `json:"configJSON,omitempty"` + DatDir string `json:"datDir,omitempty"` + ConfigJSON string `json:"configJSON,omitempty"` } // Create Xray Run Request -func NewXrayRunRequest(datDir, mphCachePath, configPath string) (string, error) { +func NewXrayRunRequest(datDir, configPath string) (string, error) { request := RunXrayRequest{ - DatDir: datDir, - MphCachePath: mphCachePath, - ConfigPath: configPath, + DatDir: datDir, + ConfigPath: configPath, } requestBytes, err := json.Marshal(&request) if err != nil { @@ -141,11 +138,10 @@ func NewXrayRunRequest(datDir, mphCachePath, configPath string) (string, error) } // Create Xray Run From JSON Request -func NewXrayRunFromJSONRequest(datDir, mphCachePath, configJSON string) (string, error) { +func NewXrayRunFromJSONRequest(datDir, configJSON string) (string, error) { request := RunXrayFromJSONRequest{ - DatDir: datDir, - MphCachePath: mphCachePath, - ConfigJSON: configJSON, + DatDir: datDir, + ConfigJSON: configJSON, } requestBytes, err := json.Marshal(&request) if err != nil { @@ -168,7 +164,7 @@ func RunXray(base64Text string) string { if err != nil { return response.EncodeToBase64("", err) } - err = xray.RunXray(request.DatDir, request.MphCachePath, request.ConfigPath) + err = xray.RunXray(request.DatDir, request.ConfigPath) return response.EncodeToBase64("", err) } @@ -184,7 +180,7 @@ func RunXrayFromJSON(base64Text string) string { if err != nil { return response.EncodeToBase64("", err) } - err = xray.RunXrayFromJSON(request.DatDir, request.MphCachePath, request.ConfigJSON) + err = xray.RunXrayFromJSON(request.DatDir, request.ConfigJSON) return response.EncodeToBase64("", err) } @@ -205,19 +201,3 @@ func XrayVersion() string { var response nodep.CallResponse[string] return response.EncodeToBase64(xray.XrayVersion(), nil) } - -// Build Mph Cache -func BuildMphCache(base64Text string) string { - var response nodep.CallResponse[string] - req, err := base64.StdEncoding.DecodeString(base64Text) - if err != nil { - return response.EncodeToBase64("", err) - } - var request RunXrayRequest - err = json.Unmarshal(req, &request) - if err != nil { - return response.EncodeToBase64("", err) - } - err = xray.BuildMphCache(request.DatDir, request.MphCachePath, request.ConfigPath) - return response.EncodeToBase64("", err) -} From 43b18eb3d58e30901e14814f70a6cbb6fea7f1de Mon Sep 17 00:00:00 2001 From: yiguo Date: Sat, 23 May 2026 12:35:21 +0800 Subject: [PATCH 2/4] temp save --- build/app/apple_go.py | 4 +-- build/app/build.py | 65 ++++++++++++++++++++++++++++++++++++++++--- build/app/linux.py | 4 +-- build/app/windows.py | 4 +-- build/main.py | 24 ++++++++++++---- go.mod | 21 +++++++------- go.sum | 64 +++++++++++++++++++----------------------- 7 files changed, 124 insertions(+), 62 deletions(-) diff --git a/build/app/apple_go.py b/build/app/apple_go.py index 7eb3e307..d01dab40 100644 --- a/build/app/apple_go.py +++ b/build/app/apple_go.py @@ -23,8 +23,8 @@ def __init__( class AppleGoBuilder(Builder): - def __init__(self, build_dir: str): - super().__init__(build_dir) + def __init__(self, build_dir: str, use_local_xray_core: bool = False): + super().__init__(build_dir, use_local_xray_core) self.framework_dir = os.path.join(self.lib_dir, "apple_xcframework") delete_dir_if_exists(self.framework_dir) create_dir_if_not_exists(self.framework_dir) diff --git a/build/app/build.py b/build/app/build.py index 47d3390a..9a7117f5 100644 --- a/build/app/build.py +++ b/build/app/build.py @@ -10,13 +10,27 @@ ) LIBXRAY_MOD_NAME = "github.com/xtls/libxray" +XRAY_CORE_REPO = "https://github.com/XTLS/Xray-core.git" +DEFAULT_XRAY_CORE_TAG = "v26.3.7" +CLONED_XRAY_CORE_DIR_NAME = "Xray-core-libXray" +LOCAL_XRAY_CORE_DIR_NAME = "Xray-core" class Builder(object): - def __init__(self, build_dir: str): + def __init__(self, build_dir: str, use_local_xray_core: bool = False): self.build_dir = build_dir - self.lib_dir = os.path.join(self.build_dir, "..") + self.lib_dir = os.path.abspath(os.path.join(self.build_dir, "..")) self.bin_file = "xray" + self.use_local_xray_core = use_local_xray_core + xray_core_dir_name = ( + LOCAL_XRAY_CORE_DIR_NAME + if self.use_local_xray_core + else CLONED_XRAY_CORE_DIR_NAME + ) + self.xray_core_replace_path = f"../{xray_core_dir_name}" + self.xray_core_dir = os.path.abspath( + os.path.join(self.lib_dir, self.xray_core_replace_path) + ) def clean_lib_files(self, files: list[str]): for file in files: @@ -28,6 +42,46 @@ def clean_lib_dirs(self, dirs: list[str]): dir_path = os.path.join(self.lib_dir, dir_name) delete_dir_if_exists(dir_path) + def prepare_xray_core(self): + if self.use_local_xray_core: + if not os.path.isdir(self.xray_core_dir): + raise Exception(f"local Xray-core dir not found: {self.xray_core_dir}") + return + + if not os.path.exists(self.xray_core_dir): + ret = subprocess.run( + [ + "git", + "clone", + "--branch", + DEFAULT_XRAY_CORE_TAG, + "--depth", + "1", + XRAY_CORE_REPO, + self.xray_core_dir, + ] + ) + if ret.returncode != 0: + raise Exception("clone Xray-core failed") + return + + if not os.path.isdir(self.xray_core_dir): + raise Exception(f"Xray-core path is not a dir: {self.xray_core_dir}") + + git_dir = os.path.join(self.xray_core_dir, ".git") + if not os.path.isdir(git_dir): + raise Exception(f"Xray-core path is not a git repo: {self.xray_core_dir}") + + ret = subprocess.run(["git", "-C", self.xray_core_dir, "fetch", "--tags"]) + if ret.returncode != 0: + raise Exception("fetch Xray-core tags failed") + + ret = subprocess.run( + ["git", "-C", self.xray_core_dir, "checkout", DEFAULT_XRAY_CORE_TAG] + ) + if ret.returncode != 0: + raise Exception(f"checkout Xray-core tag {DEFAULT_XRAY_CORE_TAG} failed") + def init_go_env(self): os.chdir(self.lib_dir) self.clean_lib_files(["go.mod", "go.sum"]) @@ -35,9 +89,11 @@ def init_go_env(self): if ret.returncode != 0: raise Exception("go mod init failed") - # apply go mod replace to use local xray-core + # apply go mod replace to use prepared xray-core with open("go.mod", "a") as f: - f.write("\nreplace github.com/xtls/xray-core => ../Xray-core\n") + f.write( + f"\nreplace github.com/xtls/xray-core => {self.xray_core_replace_path}\n" + ) ret = subprocess.run( [ @@ -101,6 +157,7 @@ def replace_package_name(self, file_name: str): f.writelines(new_lines) def before_build(self): + self.prepare_xray_core() self.init_go_env() self.download_geo() diff --git a/build/app/linux.py b/build/app/linux.py index 1b619006..5b5b8415 100644 --- a/build/app/linux.py +++ b/build/app/linux.py @@ -6,8 +6,8 @@ class LinuxBuilder(Builder): - def __init__(self, build_dir: str): - super().__init__(build_dir) + def __init__(self, build_dir: str, use_local_xray_core: bool = False): + super().__init__(build_dir, use_local_xray_core) self.framework_dir = os.path.join(self.lib_dir, "linux_so") delete_dir_if_exists(self.framework_dir) create_dir_if_not_exists(self.framework_dir) diff --git a/build/app/windows.py b/build/app/windows.py index c1112c3d..e13ee204 100644 --- a/build/app/windows.py +++ b/build/app/windows.py @@ -6,8 +6,8 @@ class WindowsBuilder(Builder): - def __init__(self, build_dir: str): - super().__init__(build_dir) + def __init__(self, build_dir: str, use_local_xray_core: bool = False): + super().__init__(build_dir, use_local_xray_core) self.framework_dir = os.path.join(self.lib_dir, "windows_dll") delete_dir_if_exists(self.framework_dir) create_dir_if_not_exists(self.framework_dir) diff --git a/build/main.py b/build/main.py index 80ac6de1..19b77fab 100644 --- a/build/main.py +++ b/build/main.py @@ -8,6 +8,8 @@ from app.linux import LinuxBuilder from app.windows import WindowsBuilder +LOCAL_ARG = "local" + def build_dir_path(): file_dir = os.path.dirname(__file__) @@ -15,31 +17,43 @@ def build_dir_path(): return dir_path +def parse_local_arg(args: list[str]) -> bool: + if not args: + return False + if args == [LOCAL_ARG]: + return True + raise Exception(f"unsupported args: {args}") + + if __name__ == "__main__": print(sys.argv) platform = sys.argv[1] if platform == "apple": tool = sys.argv[2] + use_local_xray_core = parse_local_arg(sys.argv[3:]) if tool == "go": - builder = AppleGoBuilder(build_dir_path()) + builder = AppleGoBuilder(build_dir_path(), use_local_xray_core) builder.build() elif tool == "gomobile": - builder = AppleGoMobileBuilder(build_dir_path()) + builder = AppleGoMobileBuilder(build_dir_path(), use_local_xray_core) builder.build() else: raise Exception(f"platform {platform} tool {tool} not supported") elif platform == "android": - builder = AndroidBuilder(build_dir_path()) + use_local_xray_core = parse_local_arg(sys.argv[2:]) + builder = AndroidBuilder(build_dir_path(), use_local_xray_core) builder.build() elif platform == "linux": - builder = LinuxBuilder(build_dir_path()) + use_local_xray_core = parse_local_arg(sys.argv[2:]) + builder = LinuxBuilder(build_dir_path(), use_local_xray_core) builder.build() elif platform == "windows": - builder = WindowsBuilder(build_dir_path()) + use_local_xray_core = parse_local_arg(sys.argv[2:]) + builder = WindowsBuilder(build_dir_path(), use_local_xray_core) builder.build() else: diff --git a/go.mod b/go.mod index 1edc515f..550e0a8d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/xtls/libxray -go 1.26.2 +go 1.26.3 replace github.com/xtls/xray-core => ../Xray-core @@ -14,7 +14,7 @@ require ( require ( github.com/andybalholm/brotli v1.0.6 // indirect - github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6 // indirect + github.com/apernet/quic-go v0.59.1-0.20260425001925-6c6cc9bcb716 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 // indirect @@ -29,27 +29,26 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/quic-go/qpack v0.6.0 // indirect github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect github.com/sagernet/sing v0.5.1 // indirect github.com/sagernet/sing-shadowsocks v0.2.7 // indirect github.com/vishvananda/netns v0.0.5 // indirect github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect - golang.org/x/crypto v0.50.0 // indirect + golang.org/x/crypto v0.51.0 // indirect golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect - golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b // indirect golang.org/x/mod v0.35.0 // indirect - golang.org/x/net v0.53.0 // indirect + golang.org/x/net v0.54.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.12.0 // indirect golang.org/x/tools v0.44.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect - golang.zx2c4.com/wireguard/windows v0.6.1 // indirect - google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 // indirect - google.golang.org/grpc v1.80.0 // indirect + golang.zx2c4.com/wireguard/windows v1.0.1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 // indirect + google.golang.org/grpc v1.81.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gvisor.dev/gvisor v0.0.0-20260122175437-89a5d21be8f0 // indirect lukechampine.com/blake3 v1.4.1 // indirect diff --git a/go.sum b/go.sum index cd782fe8..27e2e464 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6 h1:cbF95uMsQwCwAzH2i8+2lNO2TReoELLuqeeMfyBjFbY= -github.com/apernet/quic-go v0.59.1-0.20260330051153-c402ee641eb6/go.mod h1:Npbg8qBtAZlsAB3FWmqwlVh5jtVG6a4DlYsOylUpvzA= +github.com/apernet/quic-go v0.59.1-0.20260425001925-6c6cc9bcb716 h1:J1O+xpLuJWkdYbw5JPGwBqIHs2J8tiEP7Py9lPqkN2I= +github.com/apernet/quic-go v0.59.1-0.20260425001925-6c6cc9bcb716/go.mod h1:Npbg8qBtAZlsAB3FWmqwlVh5jtVG6a4DlYsOylUpvzA= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= @@ -48,6 +48,8 @@ github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af h1:er2acxbi3N1nvEq6HXHUAR1nTWEJmQfqiGR8EVT9rfs= github.com/refraction-networking/utls v1.8.3-0.20260301010127-aa6edf4b11af/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sagernet/sing v0.5.1 h1:mhL/MZVq0TjuvHcpYcFtmSD1BFOxZ/+8ofbNZcg1k1Y= @@ -64,62 +66,52 @@ github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f h1:iy2JRioxmUpoJ3SzbF github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f/go.mod h1:DsJblcWDGt76+FVqBVwbwRhxyyNJsGV48gJLch0OOWI= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= -go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= -go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= -go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= -go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= -go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= -go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= -go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= -go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= -go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= -golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b h1:Qt2eaXcZ8x20iAcoZ6AceeMMtnjuPHvC51KRCH1DKSQ= -golang.org/x/mobile v0.0.0-20260410095206-2cfb76559b7b/go.mod h1:5Fu78lew5ucMXt8w2KYcwvxu2rkC/liHzUvaoiI+H/M= -golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= -golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= -golang.org/x/tools v0.43.0 h1:12BdW9CeB3Z+J/I/wj34VMl8X+fEXBxVR90JeMX5E7s= -golang.org/x/tools v0.43.0/go.mod h1:uHkMso649BX2cZK6+RpuIPXS3ho2hZo4FVwfoy1vIk0= golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg= golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb h1:whnFRlWMcXI9d+ZbWg+4sHnLp52d5yiIPUxMBSt4X9A= golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb/go.mod h1:rpwXGsirqLqN2L0JDJQlwOboGHmptD5ZD6T2VmcqhTw= -golang.zx2c4.com/wireguard/windows v0.6.1 h1:XMaKojH1Hs/raMrmnir4n35nTvzvWj7NmSYzHn2F4qU= -golang.zx2c4.com/wireguard/windows v0.6.1/go.mod h1:04aqInu5GYuTFvMuDw/rKBAF7mHrltW/3rekpfbbZDM= +golang.zx2c4.com/wireguard/windows v1.0.1 h1:eOxiDVbywPC+ZQqvdCK7x+ZwWXKbYv50TtH8ysFIbw8= +golang.zx2c4.com/wireguard/windows v1.0.1/go.mod h1:+fbT3FFdX4zzYDLwJh5+HPEcNN/3HyNdzhNSVsQM+zs= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529 h1:QoMBg0moLIlB/eucPzc+ID5SgPZWuirtjAn3l8nW2Dg= -google.golang.org/genproto v0.0.0-20260420184626-e10c466a9529/go.mod h1:EjLmDZ8liSLBrCTK5vP+bGIxRQHE3ovGvOI0CzGk1PI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516 h1:sNrWoksmOyF5bvJUcnmbeAmQi8baNhqg5IWaI3llQqU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260120221211-b8f7ae30c516/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478 h1:RmoJA1ujG+/lRGNfUnOMfhCy5EipVMyvUE+KNbPbTlw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260414002931-afd174a4e478/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171 h1:ggcbiqK8WWh6l1dnltU4BgWGIGo+EVYxCaAPih/zQXQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260226221140-a57be14db171/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 32ae3b2c458376a7037d3cba9d087fc14511baa3 Mon Sep 17 00:00:00 2001 From: yiguo Date: Sat, 23 May 2026 13:06:46 +0800 Subject: [PATCH 3/4] update Xray-core to v26.5.9 --- README.md | 4 +-- build/app/build.py | 81 +++++++++++++++--------------------------- go.mod | 4 +-- go.sum | 2 ++ readme/README.zh_CN.md | 4 +-- 5 files changed, 35 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index c4cb0108..96c6763e 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ Compile script. It is recommended to always use this script to compile libXray. depends on git and go. -By default, the build script clones [Xray-core](https://github.com/XTLS/Xray-core) to `../Xray-core-libXray` and checks out `v26.5.9`. -Pass the optional `local` argument to use an existing local checkout at `../Xray-core` instead of cloning. +By default, the build script does not clone [Xray-core](https://github.com/XTLS/Xray-core). It uses Go modules and pins Xray-core to tag `v26.5.9` (recorded by Go as the matching pseudo-version). +Pass the optional `local` argument to use an existing local checkout at `../Xray-core` through a Go module `replace`. ### Usage diff --git a/build/app/build.py b/build/app/build.py index dec9ba4f..18e6a98a 100644 --- a/build/app/build.py +++ b/build/app/build.py @@ -10,9 +10,11 @@ ) LIBXRAY_MOD_NAME = "github.com/xtls/libxray" -XRAY_CORE_REPO = "https://github.com/XTLS/Xray-core.git" +XRAY_CORE_MOD_NAME = "github.com/xtls/xray-core" DEFAULT_XRAY_CORE_TAG = "v26.5.9" -CLONED_XRAY_CORE_DIR_NAME = "Xray-core-libXray" +# Xray-core CalVer tags cannot be used directly as Go module versions because +# its module path does not include /v26. This pseudo-version points to the tag above. +DEFAULT_XRAY_CORE_VERSION = "v1.260327.1-0.20260509173629-1bdb488c9ec0" LOCAL_XRAY_CORE_DIR_NAME = "Xray-core" @@ -22,12 +24,7 @@ def __init__(self, build_dir: str, use_local_xray_core: bool = False): self.lib_dir = os.path.abspath(os.path.join(self.build_dir, "..")) self.bin_file = "xray" self.use_local_xray_core = use_local_xray_core - xray_core_dir_name = ( - LOCAL_XRAY_CORE_DIR_NAME - if self.use_local_xray_core - else CLONED_XRAY_CORE_DIR_NAME - ) - self.xray_core_replace_path = f"../{xray_core_dir_name}" + self.xray_core_replace_path = f"../{LOCAL_XRAY_CORE_DIR_NAME}" self.xray_core_dir = os.path.abspath( os.path.join(self.lib_dir, self.xray_core_replace_path) ) @@ -46,41 +43,6 @@ def prepare_xray_core(self): if self.use_local_xray_core: if not os.path.isdir(self.xray_core_dir): raise Exception(f"local Xray-core dir not found: {self.xray_core_dir}") - return - - if not os.path.exists(self.xray_core_dir): - ret = subprocess.run( - [ - "git", - "clone", - "--branch", - DEFAULT_XRAY_CORE_TAG, - "--depth", - "1", - XRAY_CORE_REPO, - self.xray_core_dir, - ] - ) - if ret.returncode != 0: - raise Exception("clone Xray-core failed") - return - - if not os.path.isdir(self.xray_core_dir): - raise Exception(f"Xray-core path is not a dir: {self.xray_core_dir}") - - git_dir = os.path.join(self.xray_core_dir, ".git") - if not os.path.isdir(git_dir): - raise Exception(f"Xray-core path is not a git repo: {self.xray_core_dir}") - - ret = subprocess.run(["git", "-C", self.xray_core_dir, "fetch", "--tags"]) - if ret.returncode != 0: - raise Exception("fetch Xray-core tags failed") - - ret = subprocess.run( - ["git", "-C", self.xray_core_dir, "checkout", DEFAULT_XRAY_CORE_TAG] - ) - if ret.returncode != 0: - raise Exception(f"checkout Xray-core tag {DEFAULT_XRAY_CORE_TAG} failed") def init_go_env(self): os.chdir(self.lib_dir) @@ -89,16 +51,29 @@ def init_go_env(self): if ret.returncode != 0: raise Exception("go mod init failed") - ret = subprocess.run( - [ - "go", - "mod", - "edit", - f"-replace=github.com/xtls/xray-core={self.xray_core_replace_path}", - ] - ) - if ret.returncode != 0: - raise Exception("go mod edit replace failed") + if self.use_local_xray_core: + ret = subprocess.run( + [ + "go", + "mod", + "edit", + f"-replace={XRAY_CORE_MOD_NAME}={self.xray_core_replace_path}", + ] + ) + if ret.returncode != 0: + raise Exception("go mod edit replace failed") + else: + ret = subprocess.run( + ["go", "mod", "edit", f"-dropreplace={XRAY_CORE_MOD_NAME}"] + ) + if ret.returncode != 0: + raise Exception("go mod edit dropreplace failed") + + ret = subprocess.run( + ["go", "get", f"{XRAY_CORE_MOD_NAME}@{DEFAULT_XRAY_CORE_VERSION}"] + ) + if ret.returncode != 0: + raise Exception("go get xray-core failed") ret = subprocess.run( [ diff --git a/go.mod b/go.mod index 990d833f..645fa049 100644 --- a/go.mod +++ b/go.mod @@ -2,12 +2,10 @@ module github.com/xtls/libxray go 1.26.3 -replace github.com/xtls/xray-core => ../Xray-core-libXray - require ( github.com/stretchr/testify v1.11.1 github.com/vishvananda/netlink v1.3.1 - github.com/xtls/xray-core v0.0.0-00010101000000-000000000000 + github.com/xtls/xray-core v1.260327.1-0.20260509173629-1bdb488c9ec0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 27e2e464..106b540c 100644 --- a/go.sum +++ b/go.sum @@ -64,6 +64,8 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f h1:iy2JRioxmUpoJ3SzbFPyTxHZMbR/rSHP7dOOgYaq1O8= github.com/xtls/reality v0.0.0-20260322125925-9234c772ba8f/go.mod h1:DsJblcWDGt76+FVqBVwbwRhxyyNJsGV48gJLch0OOWI= +github.com/xtls/xray-core v1.260327.1-0.20260509173629-1bdb488c9ec0 h1:ft6HiTHelF1z9i3zZVPG9Q1LcLcvEB5jzBxky/+wljk= +github.com/xtls/xray-core v1.260327.1-0.20260509173629-1bdb488c9ec0/go.mod h1:LWadz6mFBKGPHAe0KscKjugHjmQeyDt5Na6J86ol/hY= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= diff --git a/readme/README.zh_CN.md b/readme/README.zh_CN.md index 40e38e7f..27b260bd 100644 --- a/readme/README.zh_CN.md +++ b/readme/README.zh_CN.md @@ -16,8 +16,8 @@ 依赖 git 和 go。 -默认情况下,编译脚本会将 [Xray-core](https://github.com/XTLS/Xray-core) clone 到 `../Xray-core-libXray`,并 checkout `v26.5.9`。 -传入可选参数 `local` 时,会跳过 clone,改用已有的本地仓库 `../Xray-core`。 +默认情况下,编译脚本不会 clone [Xray-core](https://github.com/XTLS/Xray-core),而是通过 Go modules 将 Xray-core 固定到 tag `v26.5.9`(Go 会记录为对应的 pseudo-version)。 +传入可选参数 `local` 时,会通过 Go module `replace` 改用已有的本地仓库 `../Xray-core`。 ### 使用方式 From 94cf4a59803e3fd221c22709497fd1d71a275911 Mon Sep 17 00:00:00 2001 From: yiguo Date: Sat, 23 May 2026 13:14:18 +0800 Subject: [PATCH 4/4] fix copilot issue --- build/app/build.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/build/app/build.py b/build/app/build.py index 18e6a98a..57154cd2 100644 --- a/build/app/build.py +++ b/build/app/build.py @@ -190,14 +190,19 @@ def build_desktop_bin(self): raise Exception(f"build_desktop_bin failed") def revert_go_env(self): - return os.chdir(self.lib_dir) ret = subprocess.run( - [ - "go", - "mod", - "tidy", - ] + ["go", "mod", "edit", f"-dropreplace={XRAY_CORE_MOD_NAME}"] ) + if ret.returncode != 0: + raise Exception("go mod edit dropreplace failed") + + ret = subprocess.run( + ["go", "get", f"{XRAY_CORE_MOD_NAME}@{DEFAULT_XRAY_CORE_VERSION}"] + ) + if ret.returncode != 0: + raise Exception("go get xray-core failed") + + ret = subprocess.run(["go", "mod", "tidy"]) if ret.returncode != 0: raise Exception("go mod tidy failed")