Skip to content

Commit d9226c7

Browse files
committed
Add support for exact version NuGet dependencies based on Maven dependency info from POM.
1 parent 73142c9 commit d9226c7

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

Directory.Build.targets

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project>
2+
<!-- Enables "ExactVersion" attribute on "ProjectReference" to allow an exact NuGet reference version to be used.
3+
https://github.com/NuGet/Home/issues/5556#issuecomment-1179526189 -->
4+
<Target Name="UseExplicitPackageVersions" BeforeTargets="GenerateNuspec">
5+
<ItemGroup>
6+
<_ProjectReferenceWithExplicitPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.PackageVersion)' != ''" />
7+
<_ProjectReferenceWithExactPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.ExactVersion)' == 'true'" />
8+
<_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExplicitPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
9+
<ProjectVersion>@(_ProjectReferenceWithExplicitPackageVersion->'%(PackageVersion)')</ProjectVersion>
10+
</_ProjectReferenceWithReassignedVersion>
11+
<_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExactPackageVersion)' == '@(_ProjectReferencesWithVersions)'">
12+
<ProjectVersion>[@(_ProjectReferencesWithVersions->'%(ProjectVersion)')]</ProjectVersion>
13+
</_ProjectReferenceWithReassignedVersion>
14+
<_ProjectReferencesWithVersions Remove="@(_ProjectReferenceWithReassignedVersion)" />
15+
<_ProjectReferencesWithVersions Include="@(_ProjectReferenceWithReassignedVersion)" />
16+
</ItemGroup>
17+
</Target>
18+
</Project>

source/AndroidXProject.cshtml

+51-3
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@
172172
<!-- ProjectReference -->
173173
@foreach (var dep in @Model.NuGetDependencies) {
174174
if (dep.IsProjectReference) {
175-
<ProjectReference Include="..\..\generated\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId)\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId).csproj" PrivateAssets="none" />
176-
175+
<ProjectReference Include="..\..\generated\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId)\@(dep.MavenArtifact.MavenGroupId).@(dep.MavenArtifact.MavenArtifactId).csproj" PrivateAssets="none" PackageVersion="@GetProjectVersionString(dep.MavenArtifact.MavenArtifactVersion, dep.NuGetVersion)" />
177176
}
178177
}
179178
</ItemGroup>
@@ -183,7 +182,7 @@
183182
<!-- PackageReference -->
184183
@foreach (var dep in @Model.NuGetDependencies) {
185184
if (!dep.IsProjectReference) {
186-
<PackageReference Include="@(dep.NuGetPackageId)" Version="@(dep.NuGetVersion)" PrivateAssets="none" />
185+
<PackageReference Include="@(dep.NuGetPackageId)" Version="@GetVersionString(dep.MavenArtifact.MavenArtifactVersion, dep.NuGetVersion)" PrivateAssets="none" />
187186
}
188187
}
189188
</ItemGroup>
@@ -204,4 +203,53 @@
204203
</PropertyGroup>
205204
}
206205

206+
@{
207+
string GetProjectVersionString (string mavenVersion, string nugetVersion)
208+
{
209+
var adjusted_string = GetVersionString (mavenVersion, nugetVersion);
210+
211+
// If nothing changed, return empty string
212+
if (adjusted_string == nugetVersion)
213+
return null;
214+
215+
return adjusted_string;
216+
}
217+
218+
string GetVersionString (string mavenVersion, string nugetVersion)
219+
{
220+
// If this isn't an exact version we don't use this code
221+
if (!mavenVersion.StartsWith ('[') || !mavenVersion.EndsWith (']') || mavenVersion.Contains (','))
222+
return nugetVersion;
223+
224+
// An exact version is requested like "1.2.0", however we want to let the revision (4th NuGet number) float,
225+
// so that our updates that don't change the Java artifact can still be used.
226+
// That is, if the POM specifies "1.2.0" and the dependency NuGet is already "1.2.0.4", we want to allow:
227+
// 1.2.0.4 >= x < 1.2.1
228+
// NuGet expresses that as "[1.2.0.4, 1.2.1)", so that's what we need to create.
229+
var lower_bound = nugetVersion;
230+
231+
var nuget_first = 0;
232+
var nuget_second = 0;
233+
var nuget_third = 0;
234+
235+
var nuget_parts = nugetVersion.Split ('.');
236+
237+
if (nuget_parts.Length > 0 && int.TryParse (nuget_parts [0], out var p1))
238+
nuget_first = p1;
239+
240+
if (nuget_parts.Length > 1 && int.TryParse (nuget_parts [1], out var p2))
241+
nuget_second = p2;
242+
243+
if (nuget_parts.Length > 2 && int.TryParse (nuget_parts [2], out var p3))
244+
nuget_third = p3;
245+
246+
// Bump the third number
247+
nuget_third++;
248+
249+
var upper_bound = $"{nuget_first}.{nuget_second}.{nuget_third}";
250+
251+
// Put it all together
252+
return $"[{lower_bound}, {upper_bound})";
253+
}
254+
}
207255
</Project>

0 commit comments

Comments
 (0)