diff --git a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs index dd4f33b..317c23b 100644 --- a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs +++ b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.Build/NugetPackageManager.cs @@ -68,44 +68,45 @@ public bool TryGetUsedPackagesDependendingOnNugetOutput(out ITaskItem[] packages using (var archive = Package.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { var nuspec = archive.GetParts().Single(part => part.Uri.ToString().EndsWith(".nuspec")); - var nugetSpec = Path.Combine(nupkgpath, Path.GetFileName(nuspec.Uri.ToString())); + var nuspecFilename = Path.GetFileName(nuspec.Uri.ToString()); + var nugetSpec = Path.Combine(nupkgpath, nuspecFilename); // use a mutex to ensure that only one process unzip the nuspec // and that one process do not start reading it due to its existence while another one is still writing it. - if (!File.Exists(nugetSpec)) + var mut = new Mutex(false, nuspecFilename); + var xml = new XmlDocument(); + try { - var mut = new Mutex(false, "UnzipNuSpec"); - try - { - mut.WaitOne(); + mut.WaitOne(); - if (!File.Exists(nugetSpec)) - try + if (!File.Exists(nugetSpec)) + { + try + { + using ( + var outputstream = new FileStream(nugetSpec, FileMode.Create, + FileAccess.ReadWrite, FileShare.None)) { - using ( - var outputstream = new FileStream(nugetSpec, FileMode.Create, - FileAccess.ReadWrite, FileShare.None)) + using (var nspecstream = nuspec.GetStream()) { - using (var nspecstream = nuspec.GetStream()) - { - nspecstream.CopyTo(outputstream); - } + nspecstream.CopyTo(outputstream); } } - catch (IOException) - { - if (!File.Exists(nugetSpec)) - throw; - } - } - finally - { - mut.ReleaseMutex(); + } + catch (IOException) + { + if (!File.Exists(nugetSpec)) + throw; + } } - } - var xml = new XmlDocument(); - xml.LoadXml(File.ReadAllText(nugetSpec)); + xml.Load(nugetSpec); + } + finally + { + mut.ReleaseMutex(); + } + var deps = xml.GetElementsByTagName("dependency"); foreach (XmlNode dep in deps) { diff --git a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec index b1318df..e6a8eb6 100644 --- a/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec +++ b/Baseclass.Contrib.Nuget.Output/Baseclass.Contrib.Nuget.Output.nuspec @@ -10,8 +10,8 @@ http://www.baseclass.ch/Contrib/Nuget false Treats the "output" folder in an dependend nuget package as an additional special folder and copies it's content to the build folder - - Added support for paket -- Added support for repository path configuration + - Fix concurrency issue regression +- Reduce scope of the mutex to optimize parallel compilations Nuget Targets Copy Output build package convention