diff --git a/src/app/FakeLib/NuGet/NugetHelper.fs b/src/app/FakeLib/NuGet/NugetHelper.fs index 3ee2afb523e..f40b2ff0915 100644 --- a/src/app/FakeLib/NuGet/NugetHelper.fs +++ b/src/app/FakeLib/NuGet/NugetHelper.fs @@ -124,12 +124,12 @@ let private replaceAccessKey key (text : string) = if isNullOrEmpty key then text else text.Replace(key, "PRIVATEKEY") -let private createNuspecFile parameters nuSpec = - let fi = fileInfo nuSpec - let specFile = parameters.WorkingDir @@ (fi.Name.Replace("nuspec", "") + parameters.Version + ".nuspec") - |> FullName +let private createNuSpecFromTemplate parameters (templateNuSpec:FileInfo) = + let specFile = parameters.WorkingDir @@ (templateNuSpec.Name.Replace("nuspec", "") + parameters.Version + ".nuspec") + |> FullName tracefn "Creating .nuspec file at %s" specFile - fi.CopyTo(specFile, true) |> ignore + + templateNuSpec.CopyTo(specFile, true) |> ignore let getFrameworkGroup (frameworkTags : (string * string) seq) = frameworkTags @@ -213,6 +213,13 @@ let private createNuspecFile parameters nuSpec = tracefn "Created nuspec file %s" specFile specFile +let private createNuSpecFromTemplateIfNuSpecFile parameters nuSpecOrProjFile = + let nuSpecOrProjFileInfo = fileInfo nuSpecOrProjFile + match nuSpecOrProjFileInfo.Extension = ".nuspec" with + | true -> Some (createNuSpecFromTemplate parameters nuSpecOrProjFileInfo) + | false -> None + + let private propertiesParam = function | [] -> "" | lst -> @@ -233,11 +240,11 @@ let private pack parameters nuspecFile = let execute args = let result = - ExecProcess (fun info -> + ExecProcessAndReturnMessages (fun info -> info.FileName <- parameters.ToolPath info.WorkingDirectory <- FullName parameters.WorkingDir info.Arguments <- args) parameters.TimeOut - if result <> 0 then failwithf "Error during NuGet package creation. %s %s" parameters.ToolPath args + if result.ExitCode <> 0 then failwithf "Error during NuGet package creation. %s %s\r\n%s" parameters.ToolPath args (toLines result.Errors) let nuspecFile = let fi = fileInfo nuspecFile @@ -315,19 +322,21 @@ let rec private publishSymbols parameters = /// /// - `setParams` - Function used to manipulate the default NuGet parameters. /// - `nuspecFile` - The .nuspec file name. -let NuGetPack setParams nuspecFile = - traceStartTask "NuGetPack" nuspecFile +let NuGetPack setParams nuspecOrProjectFile = + traceStartTask "NuGetPack" nuspecOrProjectFile let parameters = NuGetDefaults() |> setParams try - let nuspecFile = createNuspecFile parameters nuspecFile - pack parameters nuspecFile - DeleteFile nuspecFile + match (createNuSpecFromTemplateIfNuSpecFile parameters nuspecOrProjectFile) with + | Some nuspecTemplateFile -> + pack parameters nuspecTemplateFile + DeleteFile nuspecTemplateFile + | None -> pack parameters nuspecOrProjectFile with exn -> (if exn.InnerException <> null then exn.Message + "\r\n" + exn.InnerException.Message else exn.Message) |> replaceAccessKey parameters.AccessKey |> failwith - traceEndTask "NuGetPack" nuspecFile + traceEndTask "NuGetPack" nuspecOrProjectFile /// Publishes a NuGet package to the nuget server. /// ## Parameters @@ -344,22 +353,25 @@ let NuGetPublish setParams = /// /// - `setParams` - Function used to manipulate the default NuGet parameters. /// - `nuspecFile` - The .nuspec file name. -let NuGet setParams nuspecFile = - traceStartTask "NuGet" nuspecFile +let NuGet setParams nuspecOrProjectFile = + traceStartTask "NuGet" nuspecOrProjectFile let parameters = NuGetDefaults() |> setParams try - let nuspecFile = createNuspecFile parameters nuspecFile - pack parameters nuspecFile + match (createNuSpecFromTemplateIfNuSpecFile parameters nuspecOrProjectFile) with + | Some nuspecTemplateFile -> + pack parameters nuspecTemplateFile + DeleteFile nuspecTemplateFile + | None -> pack parameters nuspecOrProjectFile + if parameters.Publish then publish parameters if parameters.ProjectFile <> null then publishSymbols parameters - DeleteFile nuspecFile with exn -> (if exn.InnerException <> null then exn.Message + "\r\n" + exn.InnerException.Message else exn.Message) |> replaceAccessKey parameters.AccessKey |> failwith - traceEndTask "NuGet" nuspecFile + traceEndTask "NuGet" nuspecOrProjectFile /// NuSpec metadata type type NuSpecPackage = diff --git a/src/test/Test.FAKECore/PackageMgt/NugetSpecs.cs b/src/test/Test.FAKECore/PackageMgt/NugetSpecs.cs index bd2bda8d3a7..fa89fc11e68 100644 --- a/src/test/Test.FAKECore/PackageMgt/NugetSpecs.cs +++ b/src/test/Test.FAKECore/PackageMgt/NugetSpecs.cs @@ -58,9 +58,73 @@ public class when_packing_with_nuspec_template }; Because of = () => NuGetHelper.NuGetPack(nugetParams, nuspecFile); + + It should_create_nupkg_file = () => File.Exists(pkgFile).ShouldBeTrue(); + } + + public class when_packing_with_csproj_and_complete_nuspec_alongside + { + static string tempDir, pkgFile, projectFile; + static FSharpFunc nugetParams; + + Establish context = () => + { + tempDir = Path.GetTempPath(); + pkgFile = Path.Combine(tempDir, "fake_no_template.0.0.1.nupkg"); + projectFile = Path.Combine(TestData.TestDataDir, "fake_no_template.csproj"); + + try { File.Delete(pkgFile); } catch (FileNotFoundException) { } + + nugetParams = FSharpFuncUtil.ToFSharpFunc( + p => new NuGetHelper.NuGetParams( + authors: ListModule.OfSeq(new[] { "author" }), + project: "fake", + description: "description", + outputPath: tempDir, + summary: "summary", + workingDir: TestData.TestDataDir, + version: "0.0.1", + + files: ListModule.OfSeq(new[] { new Tuple, FSharpOption>("*.*", FSharpOption.None, FSharpOption.None) }), + + accessKey: p.AccessKey, + copyright: p.Copyright, + dependencies: p.Dependencies, + dependenciesByFramework: p.DependenciesByFramework, + includeReferencedProjects: p.IncludeReferencedProjects, + noDefaultExcludes: p.NoDefaultExcludes, + noPackageAnalysis: p.NoPackageAnalysis, + projectFile: p.ProjectFile, + properties: p.Properties, + publish: p.Publish, + publishTrials: p.PublishTrials, + publishUrl: p.PublishUrl, + references: p.References, + referencesByFramework: p.ReferencesByFramework, + releaseNotes: p.ReleaseNotes, + symbolPackage: p.SymbolPackage, + tags: p.Tags, + timeOut: p.TimeOut, + title: p.Title, + toolPath: p.ToolPath + ) + ); + }; + + + private Because of = () => + { + if (!EnvironmentHelper.isMono) + { + NuGetHelper.NuGetPack(nugetParams, projectFile); + }; + }; It should_create_nupkg_file = () => { - File.Exists(pkgFile).ShouldBeTrue(); + if (!EnvironmentHelper.isMono) + { + File.Exists(pkgFile).ShouldBeTrue(); + } }; } diff --git a/src/test/Test.FAKECore/Test.FAKECore.csproj b/src/test/Test.FAKECore/Test.FAKECore.csproj index 4287645d902..9823a4bcb91 100644 --- a/src/test/Test.FAKECore/Test.FAKECore.csproj +++ b/src/test/Test.FAKECore/Test.FAKECore.csproj @@ -225,6 +225,12 @@ Always + + Always + + + Always + Always @@ -234,10 +240,17 @@ PreserveNewest + + Always + + Designer + Always + + Always Designer diff --git a/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.dll b/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.dll new file mode 100644 index 00000000000..b0f6dc2ed7e Binary files /dev/null and b/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.dll differ diff --git a/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.pdb b/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.pdb new file mode 100644 index 00000000000..86bdd8b2424 Binary files /dev/null and b/src/test/Test.FAKECore/TestData/bin/Debug/TestNuGetPack.pdb differ diff --git a/src/test/Test.FAKECore/TestData/fake_no_template.csproj b/src/test/Test.FAKECore/TestData/fake_no_template.csproj new file mode 100644 index 00000000000..319e9be35d6 --- /dev/null +++ b/src/test/Test.FAKECore/TestData/fake_no_template.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {0D71FF59-482C-4CC2-A068-351C9FCF5555} + Library + Properties + TestNuGetPack + TestNuGetPack + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/Test.FAKECore/TestData/fake_no_template.nuspec b/src/test/Test.FAKECore/TestData/fake_no_template.nuspec new file mode 100644 index 00000000000..c0042ab714a --- /dev/null +++ b/src/test/Test.FAKECore/TestData/fake_no_template.nuspec @@ -0,0 +1,20 @@ + + + + description + fake_no_template + 0.0.1 + author + en-US + summary + http://www.github.com/fsharp/Fake + http://www.github.com/fsharp/Fake/blob/master/License.txt + https://raw.githubusercontent.com/fsharp/FAKE/master/help/pics/logo.png + + build, fake, f# + + + + + +