Skip to content

Commit 7a0852c

Browse files
committed
(GH-99) modified CCG0007
so the current rules are only valid for addins and added a new rule, for modules, to target only NetStandard20
1 parent a3fa13f commit 7a0852c

File tree

7 files changed

+108
-25
lines changed

7 files changed

+108
-25
lines changed

docs/input/guidelines/RecommendedReferences.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Title: Recommended References
1717

1818
## Goals
1919

20-
To have consistency in code-style among the different tools/plugins the use of Analysers is recommended, especially the use of [StyleCop](https://github.com/DotNetAnalyzers/StyleCopAnalyzers). Additionally code-style anlysis using StyleCopy (and code generation in the IDE) should be properly configured using a `stylecop.json`-file as well as `.editorconfig`-file, respectively.
20+
To have consistency in code-style among the different tools/plugins the use of Analysers is recommended, especially the use of [StyleCop](https://github.com/DotNetAnalyzers/StyleCopAnalyzers). Additionally code-style analysis using StyleCopy (and code generation in the IDE) should be properly configured using a `stylecop.json`-file as well as `.editorconfig`-file, respectively.
2121

2222
Example-Files can be found at:
2323

docs/input/guidelines/TargetFramework.md

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,27 @@ Title: Target Frameworks
1818

1919
## Goals
2020

21-
Each addin should have maximum compatibility when being used. Toward that end some Framework versions are required and some others are
21+
Each addin/module should have maximum compatibility when being used. Toward that end some Framework versions are required and some others are
2222
suggested, depending on the Cake.Core version that is being referenced.
2323

2424
### Required / Suggested versions
2525

26-
Depending on the referenced `Cake.Core`-version different target versions are required and/or suggested.
26+
Depending on the package type and the referenced `Cake.Core`-version different target versions are required and/or suggested.
2727
Missing a required target version will raise [CCG0007](../rules/ccg0007) as an error
2828
while missing a suggested target version will raise [CCG0007](../rules/ccg0007) as a warning.
2929

30-
* Cake.Core < 1.0.0
30+
* Package type: addin
31+
* Cake.Core < 1.0.0
32+
* Required: `netstandard2.0`
33+
* Suggested: `net461`
34+
* alternative: `net46`
35+
* Cake.Core >= 1.0.0
36+
* Required: `netstandard2.0`
37+
* Suggested: `net461`
38+
* alternative: `net46`
39+
* Suggested: `net5.0`
40+
* Package type: module
3141
* Required: `netstandard2.0`
32-
* Suggested: `net461`
33-
* alternative: `net46`
34-
* Cake.Core >= 1.0.0
35-
* Required: `netstandard2.0`
36-
* Suggested: `net461`
37-
* alternative: `net46`
38-
* Suggested: `net5.0`
3942

4043
## Related rules
4144

src/Guidelines/build/TargetFrameworkVersions.targets

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
<Target
99
Name="_CheckTargetFrameworkVersions"
1010
AfterTargets="BeforeBuild"
11-
BeforeTargets="CoreBuild">
11+
BeforeTargets="CoreBuild"
12+
DependsOnTargets="EnsureProjectTypeIsSet">
13+
1214
<!-- All other rules have some "configuration" here, this rules required/suggested targets are hard-coded in the task. Sadly. -->
1315

1416
<TargetFrameworkVersions
1517
References="@(PackageReference)"
1618
TargetFramework="$(TargetFramework)"
1719
TargetFrameworks="$(TargetFrameworks)"
1820
Omitted="@(CakeContribGuidelinesOmitTargetFramework)"
19-
ProjectFile="$(MSBuildProjectFullPath)" />
21+
ProjectType="$(CakeContribGuidelinesProjectType)" />
2022
</Target>
2123
</Project>

src/Tasks.IntegrationTests/E2eTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,25 @@ public void Referencing_CakeCore_With_all_targets_raises_no_warning()
251251
result.WarningLines.Should().BeEmpty();
252252
}
253253

254+
[Fact]
255+
public void Referencing_CakeCore_With_NetStandard_raises_no_warning_If_PackageType_Is_Module()
256+
{
257+
// given
258+
fixture.WithPackageReference("Cake.Core", "1.0.0", "all");
259+
fixture.WithTargetFrameworks("netstandard2.0");
260+
fixture.WithCustomContent(@"
261+
<PropertyGroup>
262+
<PackageId>Cake.Buildsystems.Module</PackageId>
263+
</PropertyGroup>");
264+
265+
// when
266+
var result = fixture.Run();
267+
268+
// then
269+
result.IsErrorExitCode.Should().BeFalse();
270+
result.WarningLines.Should().BeEmpty();
271+
}
272+
254273
[Fact]
255274
public void ProjectType_Default_Is_Addin()
256275
{

src/Tasks.Tests/Fixtures/TargetFrameworkVersionsFixture.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ public void WithCakeCoreReference(int major = 0, int minor = 0, int patch = 0)
5656
references.Add(cakeRef.Object);
5757
}
5858

59-
public void WithProjectFile(string fileName)
59+
public void WithProjectType(string projectType)
6060
{
61-
Task.ProjectFile = fileName;
61+
Task.ProjectType = projectType;
6262
}
6363
}
6464
}

src/Tasks.Tests/TargetFrameworkVersionsTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,37 @@ public void Should_Not_Warn_If_All_References_for_Cake_Version_is_1_0_0_is_prese
137137
fixture.BuildEngine.ErrorEvents.Should().HaveCount(0);
138138
fixture.BuildEngine.WarningEvents.Should().HaveCount(0);
139139
}
140+
141+
[Fact]
142+
public void Should_Error_If_ProjectType_Is_Module_And_Reference_Is_Missing()
143+
{
144+
// given
145+
var fixture = new TargetFrameworkVersionsFixture();
146+
fixture.WithCakeCoreReference(1);
147+
fixture.WithProjectType("module");
148+
149+
// when
150+
fixture.Execute();
151+
152+
// then
153+
fixture.BuildEngine.ErrorEvents.Should().HaveCount(1);
154+
}
155+
156+
[Fact]
157+
public void Should_Not_Warn_If_ProjectType_Is_Module_And_Reference_Is_NetStandard()
158+
{
159+
// given
160+
var fixture = new TargetFrameworkVersionsFixture();
161+
fixture.WithCakeCoreReference(1);
162+
fixture.WithTargetFramework("netstandard2.0");
163+
fixture.WithProjectType("module");
164+
165+
// when
166+
fixture.Execute();
167+
168+
// then
169+
fixture.BuildEngine.ErrorEvents.Should().HaveCount(0);
170+
fixture.BuildEngine.WarningEvents.Should().HaveCount(0);
171+
}
140172
}
141173
}

src/Tasks/TargetFrameworkVersions.cs

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,19 @@ public class TargetFrameworkVersions : Task
4242
SuggestedTargets = new[] { TargetsDefinition.From(Net461, Net46) },
4343
};
4444

45-
private static readonly Dictionary<Predicate<Version>, TargetsDefinitions> SpecificTargets =
46-
new Dictionary<Predicate<Version>, TargetsDefinitions>
45+
private static readonly Dictionary<Predicate<Differentiator>, TargetsDefinitions> SpecificTargets =
46+
new Dictionary<Predicate<Differentiator>, TargetsDefinitions>
4747
{
4848
{
49-
v => v.GreaterEqual(V0_26_0) && v.LessThan(V1_0_0),
49+
d => d.IsModuleProject,
50+
new TargetsDefinitions
51+
{
52+
Name = "Module",
53+
RequiredTargets = new[] { TargetsDefinition.From(NetStandard20) },
54+
}
55+
},
56+
{
57+
d => !d.IsModuleProject && d.Version.GreaterEqual(V0_26_0) && d.Version.LessThan(V1_0_0),
5058
new TargetsDefinitions
5159
{
5260
Name = "0.26.0 <= x < 1.0.0",
@@ -55,7 +63,7 @@ public class TargetFrameworkVersions : Task
5563
}
5664
},
5765
{
58-
v => v.GreaterEqual(V1_0_0),
66+
d => !d.IsModuleProject && d.Version.GreaterEqual(V1_0_0),
5967
new TargetsDefinitions
6068
{
6169
Name = "x >= 1.0.0",
@@ -88,9 +96,10 @@ public class TargetFrameworkVersions : Task
8896
public ITaskItem TargetFramework { get; set; }
8997

9098
/// <summary>
91-
/// Gets or sets the project file.
99+
/// Gets or sets the ProjectType.
92100
/// </summary>
93-
public string ProjectFile { get; set; }
101+
[Required]
102+
public string ProjectType { get; set; }
94103

95104
/// <summary>
96105
/// Gets or sets Targets to omit. I.e. if those are missing, they will not be reported.
@@ -115,7 +124,7 @@ public override bool Execute()
115124
{
116125
Log.CcgWarning(
117126
7,
118-
ProjectFile,
127+
BuildEngine.ProjectFileOfTaskNode,
119128
$"Cake.Core has a version of {cakeCore.GetMetadata("version")} which is not a valid version. Using default TargetVersions.");
120129
return Execute(DefaultTarget);
121130
}
@@ -126,7 +135,12 @@ public override bool Execute()
126135

127136
foreach (var targetsDefinition in SpecificTargets)
128137
{
129-
var match = targetsDefinition.Key(version);
138+
var differentiator = new Differentiator
139+
{
140+
IsModuleProject = "module".Equals(ProjectType, StringComparison.OrdinalIgnoreCase),
141+
Version = version,
142+
};
143+
var match = targetsDefinition.Key(differentiator);
130144
if (!match)
131145
{
132146
continue;
@@ -187,7 +201,7 @@ private bool Execute(TargetsDefinitions targets)
187201

188202
Log.CcgError(
189203
7,
190-
ProjectFile,
204+
BuildEngine.ProjectFileOfTaskNode,
191205
"Missing required target: " + requiredTarget.Name);
192206
return false;
193207
}
@@ -220,7 +234,7 @@ private bool Execute(TargetsDefinitions targets)
220234

221235
Log.CcgWarning(
222236
7,
223-
ProjectFile,
237+
BuildEngine.ProjectFileOfTaskNode,
224238
"Missing suggested target: " + suggestedTarget.Name);
225239
}
226240

@@ -229,6 +243,12 @@ private bool Execute(TargetsDefinitions targets)
229243

230244
private class TargetsDefinitions
231245
{
246+
public TargetsDefinitions()
247+
{
248+
RequiredTargets = Array.Empty<TargetsDefinition>();
249+
SuggestedTargets = Array.Empty<TargetsDefinition>();
250+
}
251+
232252
public string Name { get; set; }
233253

234254
public TargetsDefinition[] RequiredTargets { get; set; }
@@ -247,5 +267,12 @@ public static TargetsDefinition From(string name, params string[] alternatives)
247267
return new TargetsDefinition { Name = name, Alternatives = alternatives ?? Array.Empty<string>(), };
248268
}
249269
}
270+
271+
private class Differentiator
272+
{
273+
internal Version Version { get; set; }
274+
275+
internal bool IsModuleProject { get; set; }
276+
}
250277
}
251278
}

0 commit comments

Comments
 (0)