|
12 | 12 |
|
13 | 13 | open System |
14 | 14 | open System.IO |
15 | | -open System.Reflection |
16 | 15 | open Fake |
17 | 16 | open FSharp.Data |
18 | | -open Mono.Cecil |
19 | 17 |
|
20 | 18 | open Paths |
21 | 19 | open Projects |
@@ -78,100 +76,47 @@ module Build = |
78 | 76 | CleanDir Paths.BuildOutput |
79 | 77 | DotNetCli.RunCommand (fun p -> { p with TimeOut = TimeSpan.FromMinutes(5.) }) "clean src/Elasticsearch.sln -c Release" |> ignore |
80 | 78 | DotNetProject.All |> Seq.iter(fun p -> CleanDir(Paths.BinFolder p.Name)) |
81 | | - |
82 | | - type CustomResolver(folder) = |
83 | | - inherit DefaultAssemblyResolver() |
84 | | - member this.Folder = folder; |
85 | | - |
86 | | - override this.Resolve name = |
87 | | - try |
88 | | - base.Resolve name |
89 | | - with |
90 | | - | ex -> |
91 | | - AssemblyDefinition.ReadAssembly(Path.Combine(folder, "Elasticsearch.Net.dll")); |
92 | | - |
93 | | - let private rewriteNamespace nest f = |
94 | | - trace "Rewriting namespaces" |
95 | | - let folder = Paths.ProjectOutputFolder nest f |
96 | | - let nestDll = sprintf "%s/%s.dll" folder nest.Name |
97 | | - let nestRewrittenDll = sprintf "%s/%s-rewriten.dll" folder nest.Name |
98 | | - use resolver = new CustomResolver(folder) |
99 | | - let readerParams = ReaderParameters( AssemblyResolver = resolver, ReadWrite = true ); |
100 | | - use nestAssembly = AssemblyDefinition.ReadAssembly(nestDll, readerParams); |
101 | 79 |
|
102 | | - for item in nestAssembly.MainModule.Types do |
103 | | - if item.Namespace.StartsWith("Newtonsoft.Json") then |
104 | | - item.Namespace <- item.Namespace.Replace("Newtonsoft.Json", "Nest.Json") |
105 | | - |
106 | | - // Touch custom attribute arguments |
107 | | - // Cecil does not update the types referenced within these attributes automatically, |
108 | | - // so enumerate them to ensure namespace renaming is reflected in these references. |
109 | | - let touchAttributes (attributes:Mono.Collections.Generic.Collection<CustomAttribute>) = |
110 | | - for attr in attributes do |
111 | | - if attr.HasConstructorArguments then |
112 | | - for constArg in attr.ConstructorArguments do |
113 | | - if constArg.Type.Name = "Type" then ignore() |
114 | | - |
115 | | - // rewrite explicitly implemented interface definitions defined |
116 | | - // in Newtonsoft.Json |
117 | | - let rewriteName (method:IMemberDefinition) = |
118 | | - if method.Name.Contains("Newtonsoft.Json") then |
119 | | - method.Name <- method.Name.Replace("Newtonsoft.Json", "Nest.Json") |
120 | | - |
121 | | - // recurse through all types and nested types |
122 | | - let rec rewriteTypes (types:Mono.Collections.Generic.Collection<TypeDefinition>) = |
123 | | - for t in types do |
124 | | - touchAttributes t.CustomAttributes |
125 | | - for prop in t.Properties do |
126 | | - touchAttributes prop.CustomAttributes |
127 | | - rewriteName prop |
128 | | - if prop.GetMethod <> null then rewriteName prop.GetMethod |
129 | | - if prop.SetMethod <> null then rewriteName prop.SetMethod |
130 | | - for method in t.Methods do |
131 | | - touchAttributes method.CustomAttributes |
132 | | - rewriteName method |
133 | | - for over in method.Overrides do rewriteName method |
134 | | - for field in t.Fields do touchAttributes field.CustomAttributes |
135 | | - for interf in t.Interfaces do touchAttributes interf.CustomAttributes |
136 | | - for event in t.Events do touchAttributes event.CustomAttributes |
137 | | - if t.HasNestedTypes then rewriteTypes t.NestedTypes |
138 | | - |
139 | | - nestAssembly.MainModule.Types |> rewriteTypes |
| 80 | + let private assemblyRewriter = Paths.PaketDotNetGlobalTool "assembly-rewriter" @"tools\netcoreapp2.1\any\assembly-rewriter.dll" |
| 81 | + let private keyFile = Paths.Keys "keypair.snk" |
| 82 | + let Rewrite version framework projects = |
| 83 | + let project = projects |> Seq.head |
| 84 | + let folder = Paths.ProjectOutputFolder project framework |
140 | 85 |
|
141 | | - let resources = nestAssembly.MainModule.Resources |
142 | | - for i = resources.Count-1 downto 0 do |
143 | | - let resource = resources.[i] |
144 | | - // remove the Newtonsoft signing key |
145 | | - if resource.Name = "Newtonsoft.Json.Dynamic.snk" then resources.Remove(resource) |> ignore |
146 | | - |
147 | | - let key = File.ReadAllBytes(Paths.Keys("keypair.snk")) |
148 | | - let kp = StrongNameKeyPair(key) |
149 | | - let wp = WriterParameters ( StrongNameKeyPair = kp); |
150 | | - nestAssembly.Write(wp) |> ignore; |
151 | | - trace "Finished rewriting namespaces" |
| 86 | + let dllFullPath name = sprintf "%s/%s.dll" folder name |
| 87 | + let outputName (p: DotNetProject) = match p.Name = project.Name with | true -> p.Name | _ -> p.InternalName |
| 88 | + let fullOutput (p: DotNetProject) = dllFullPath (p.Versioned (outputName p) version) |
| 89 | + let dlls = |
| 90 | + projects |
| 91 | + |> Seq.map (fun p -> sprintf @"-i ""%s"" -o ""%s"" " (dllFullPath p.Name) (fullOutput p)) |
| 92 | + |> Seq.fold (+) " " |
| 93 | + |
| 94 | + let mergeCommand = sprintf @"%s %s" assemblyRewriter dlls |
| 95 | + DotNetCli.RunCommand (fun p -> { p with TimeOut = TimeSpan.FromMinutes(3.) }) mergeCommand |> ignore |
| 96 | + |
| 97 | + let mergedOutFile = fullOutput project |
| 98 | + let ilMergeArgs = [ |
| 99 | + "/internalize"; |
| 100 | + (sprintf "/lib:%s" folder); |
| 101 | + (sprintf "/keyfile:%s" keyFile); |
| 102 | + (sprintf "/out:%s" mergedOutFile) |
| 103 | + ] |
| 104 | + let mergeDlls = |
| 105 | + projects |
| 106 | + |> Seq.filter (fun p -> p.Name = project.Name || not <| (DotNetProject.AllPublishable |> Seq.contains p)) |
| 107 | + |> Seq.map fullOutput |
| 108 | + match project.NeedsMerge with |
| 109 | + | true -> Tooling.ILRepack.Exec (ilMergeArgs |> Seq.append mergeDlls) |> ignore |
| 110 | + | _ -> Tooling.ILRepack.Exec (ilMergeArgs |> Seq.append [mergeDlls |> Seq.head]) |> ignore |
152 | 111 |
|
153 | 112 | let private ilRepackInternal() = |
154 | 113 | let fw = DotNetFramework.All |
155 | | - for f in fw do |
156 | | - let nest = Project Project.Nest |
157 | | - let folder = Paths.ProjectOutputFolder nest f |
158 | | - let nestDll = sprintf "%s/%s.dll" folder nest.Name |
159 | | - let nestMergedDll = sprintf "%s/%s-merged.dll" folder nest.Name |
160 | | - let jsonDll = sprintf "%s/Newtonsoft.Json.dll" folder |
161 | | - let keyFile = Paths.Keys("keypair.snk"); |
162 | | - let options = |
163 | | - [ |
164 | | - "/keyfile:", keyFile; |
165 | | - "/internalize", ""; |
166 | | - "/lib:", folder; |
167 | | - "/out:", nestDll; |
168 | | - ] |
169 | | - |> List.map (fun (p,v) -> sprintf "%s%s" p v) |
170 | | - |
171 | | - let args = [nestDll; jsonDll;] |> List.append options; |
172 | | - |
173 | | - Tooling.ILRepack.Exec args |> ignore |
174 | | - rewriteNamespace nest f |> ignore |
| 114 | + let projects = DotNetProject.AllPublishable |
| 115 | + let currentMajor = sprintf "%i" <| Versioning.CurrentVersion.Major |
| 116 | + for f in fw do |
| 117 | + for p in projects do |
| 118 | + if p.VersionedMergeDependencies <> [] then Rewrite (Some currentMajor) f p.VersionedMergeDependencies |
| 119 | + if p.MergeDependencies <> [] then Rewrite None f p.MergeDependencies |
175 | 120 |
|
176 | 121 | let ILRepack() = |
177 | 122 | //nothing to IL merge in the 5.x branch |
|
0 commit comments