Skip to content

Commit 451efe2

Browse files
authored
Merge pull request #67 from ngyukman/master
Support dependencies from PackageReference
2 parents 7d00f4f + 4ec6373 commit 451efe2

File tree

8 files changed

+210
-3
lines changed

8 files changed

+210
-3
lines changed

gradle.properties

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
version = 2.16
2-
1+
version = 2.17

src/main/groovy/com/ullink/NuGetSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.ullink
22

33
import com.ullink.packagesparser.NugetParser
4+
import com.ullink.packagesparser.PackageReferenceParser
45
import com.ullink.packagesparser.PackagesConfigParser
56
import com.ullink.packagesparser.ProjectJsonParser
67
import groovy.util.slurpersupport.GPathResult
@@ -111,6 +112,7 @@ class NuGetSpec extends Exec {
111112
def dependencies = []
112113
dependencies.addAll getDependencies(mainProject, packageConfigFileName, new PackagesConfigParser())
113114
dependencies.addAll getDependencies(mainProject, projectJsonFileName, new ProjectJsonParser())
115+
dependencies.addAll getDependencies(mainProject, mainProject.properties.MSBuildProjectFile.toString(), new PackageReferenceParser())
114116

115117
if (!dependencies.isEmpty())
116118
setDefaultMetadata('dependencies', dependencies)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.ullink.packagesparser
2+
3+
import groovy.util.slurpersupport.GPathResult
4+
5+
6+
class PackageReferenceParser implements NugetParser {
7+
8+
// Limitation: does not resolve the conditional package references into groups
9+
10+
@Override
11+
Collection getDependencies(File file) {
12+
def defaultDependencies = []
13+
14+
def project = new XmlSlurper().parse(file)
15+
16+
project.'**'
17+
.findAll { it.name() == 'PackageReference' && getAttributeOrNodeText(it, 'PrivateAssets') != 'all' }
18+
.each {
19+
def reference = it as GPathResult
20+
def includeAssets = getAttributeOrNodeText(reference, 'IncludeAssets')
21+
def excludeAssets = getAttributeOrNodeText(reference, 'ExcludeAssets')
22+
def args = [
23+
id: getAttributeOrNodeText(reference, 'Include'), version: getAttributeOrNodeText(reference, 'Version')
24+
]
25+
if (includeAssets) {
26+
args.include = includeAssets
27+
}
28+
if (excludeAssets) {
29+
args.exclude = excludeAssets
30+
}
31+
32+
defaultDependencies.add({
33+
dependency(args)
34+
})
35+
}
36+
return defaultDependencies
37+
}
38+
39+
private static String getAttributeOrNodeText(GPathResult parentNode, String key) {
40+
def node = parentNode."${key}".toString().trim()
41+
if (node) {
42+
return node
43+
}
44+
return parentNode["@${key}"]
45+
}
46+
47+
}

src/test/groovy/com/ullink/MSBuildTaskBuilder.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ class MSBuildTaskBuilder {
4646
public MSBuildTaskBuilder withProjectFile(File file) {
4747
withProjectFile(file.path)
4848
}
49+
50+
public MSBuildTaskBuilder withMainProjectProperty(String name, String value) {
51+
mainProjectProperties[name] = value
52+
this
53+
}
4954
}

src/test/groovy/com/ullink/NuGetSpecTest.groovy

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,4 +557,48 @@ class NuGetSpecTest {
557557
assertXMLEqual(expected, nuspecGenerated)
558558
}
559559
}
560+
561+
@Test
562+
public void generateNuspec_defaultDependenciesFromProjectPackageReferences() {
563+
def project = newNugetProject()
564+
565+
project.nugetSpec {
566+
nuspec {}
567+
}
568+
569+
File.createTempDir().with { projectFolder ->
570+
deleteOnExit()
571+
572+
def csproj = new File(getClass().getResource('packageparser/packagereference.csproj').toURI())
573+
def msbuildTask = new MSBuildTaskBuilder()
574+
.withAssemblyName('bar')
575+
.withProjectFile(csproj)
576+
.withMainProjectProperty('MSBuildProjectFile', 'packagereference.csproj')
577+
.build()
578+
579+
project.tasks.add(msbuildTask)
580+
581+
def expected =
582+
'''
583+
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
584+
<metadata>
585+
<id>foo</id>
586+
<version>2.1</version>
587+
<description>fooDescription</description>
588+
<dependencies>
589+
<dependency id="Microsoft.AspNetCore.Mvc.Abstractions" version="1.1.2"/>
590+
<dependency id="Microsoft.AspNetCore.Mvc.Core" version="1.1.2"/>
591+
<dependency id="Microsoft.Extensions.Caching.Abstractions" version="1.1.1"/>
592+
<dependency id="Microsoft.Extensions.Configuration.Binder" version="1.1.1"/>
593+
<dependency id="Newtonsoft.Json" version="9.0.1"/>
594+
<dependency id="StyleCop.Analyzers" version="1.0.0"/>
595+
<dependency id="NuGet.Versioning" version="3.6.0" include="build" exclude="none"/>
596+
<dependency id="System.Xml.XDocument" version="4.3.0"/>
597+
</dependencies>
598+
</metadata>
599+
</package>'''
600+
def nuspecGenerated = project.tasks.nugetSpec.generateNuspec()
601+
assertXMLEqual(expected, nuspecGenerated)
602+
}
603+
}
560604
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*************************************************************************
2+
* ULLINK CONFIDENTIAL INFORMATION
3+
* _______________________________
4+
*
5+
* All Rights Reserved.
6+
*
7+
* NOTICE: This file and its content are the property of Ullink. The
8+
* information included has been classified as Confidential and may
9+
* not be copied, modified, distributed, or otherwise disseminated, in
10+
* whole or part, without the express written permission of Ullink.
11+
************************************************************************/
12+
package com.ullink.packageparser
13+
14+
import com.ullink.packagesparser.PackageReferenceParser
15+
import groovy.xml.MarkupBuilder
16+
import spock.lang.Specification
17+
18+
class PackageReferenceParserSpec extends Specification {
19+
def 'Extract dependencies from PackageReference from csproj'() {
20+
given:
21+
def csproj = new File(getClass().getResource('packagereference.csproj').toURI())
22+
23+
when:
24+
def result = new PackageReferenceParser().getDependencies(csproj)
25+
26+
then:
27+
def writer = new StringWriter()
28+
def xml = new MarkupBuilder(writer)
29+
xml.dependencies() {
30+
result.each {
31+
it.resolveStrategy = DELEGATE_FIRST
32+
it.delegate = delegate
33+
it.call()
34+
}
35+
}
36+
writer.toString() == '''<dependencies>
37+
<dependency id='Microsoft.AspNetCore.Mvc.Abstractions' version='1.1.2' />
38+
<dependency id='Microsoft.AspNetCore.Mvc.Core' version='1.1.2' />
39+
<dependency id='Microsoft.Extensions.Caching.Abstractions' version='1.1.1' />
40+
<dependency id='Microsoft.Extensions.Configuration.Binder' version='1.1.1' />
41+
<dependency id='Newtonsoft.Json' version='9.0.1' />
42+
<dependency id='StyleCop.Analyzers' version='1.0.0' />
43+
<dependency id='NuGet.Versioning' version='3.6.0' include='build' exclude='none' />
44+
<dependency id='System.Xml.XDocument' version='4.3.0' />
45+
</dependencies>'''
46+
}
47+
}

src/test/groovy/com/ullink/ProjectJsonParserSpec.groovy renamed to src/test/groovy/com/ullink/packageparser/ProjectJsonParserSpec.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.ullink
1+
package com.ullink.packageparser
22

33
import com.ullink.packagesparser.ProjectJsonParser
44
import groovy.json.JsonBuilder
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<Description>...</Description>
5+
<AssemblyTitle>ASP.NET Core MVC 6 Boilerplate Framework</AssemblyTitle>
6+
<VersionPrefix>2.2.2</VersionPrefix>
7+
<Authors>Muhammad Rehan Saeed (RehanSaeed.com)</Authors>
8+
<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>
9+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
10+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
11+
<AssemblyName>Boilerplate.AspNetCore</AssemblyName>
12+
<AssemblyOriginatorKeyFile>../../../Key.snk</AssemblyOriginatorKeyFile>
13+
<SignAssembly>true</SignAssembly>
14+
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>
15+
<PackageId>Boilerplate.AspNetCore</PackageId>
16+
<PackageTags>ASP.NET;ASP.NET Core;MVC;MVC 6;Boilerplate;Muhammad Rehan Saeed;Framework</PackageTags>
17+
<PackageReleaseNotes>Updated to ASP.NET Core 1.1.2.</PackageReleaseNotes>
18+
<PackageIconUrl>https://github.com/RehanSaeed/ASP.NET-MVC-Boilerplate/master/Images/Icon.png</PackageIconUrl>
19+
<PackageProjectUrl>https://github.com/ASP-NET-MVC-Boilerplate/Framework</PackageProjectUrl>
20+
<PackageLicenseUrl>https://github.com/ASP-NET-MVC-Boilerplate/Framework/blob/master/LICENSE</PackageLicenseUrl>
21+
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
22+
<RepositoryType>git</RepositoryType>
23+
<RepositoryUrl>https://github.com/ASP-NET-MVC-Boilerplate/Framework.git</RepositoryUrl>
24+
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
25+
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
26+
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
27+
</PropertyGroup>
28+
29+
<ItemGroup>
30+
<ProjectReference Include="..\Boilerplate\Boilerplate.csproj" />
31+
</ItemGroup>
32+
33+
<ItemGroup>
34+
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions">
35+
<Version>1.1.2</Version>
36+
</PackageReference>
37+
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="1.1.2" />
38+
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="1.1.1" />
39+
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="1.1.1" />
40+
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
41+
<PackageReference Include="StyleCop.Analyzers" Version="1.0.0">
42+
<PrivateAssets>All</PrivateAssets>
43+
</PackageReference>
44+
<PackageReference Include="NuGet.Versioning" Version="3.6.0">
45+
<IncludeAssets>build</IncludeAssets>
46+
<ExcludeAssets>none</ExcludeAssets>
47+
<PrivateAssets>contentfiles;analyzers;build</PrivateAssets>
48+
</PackageReference>
49+
</ItemGroup>
50+
51+
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' ">
52+
<PackageReference Include="System.Xml.XDocument" Version="4.3.0" />
53+
</ItemGroup>
54+
55+
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
56+
<Reference Include="System.ServiceModel" />
57+
<Reference Include="System.Xml" />
58+
<Reference Include="System.Xml.Linq" />
59+
<Reference Include="System" />
60+
<Reference Include="Microsoft.CSharp" />
61+
</ItemGroup>
62+
63+
</Project>

0 commit comments

Comments
 (0)