You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by br...@apache.org on 2013/03/04 13:54:09 UTC
svn commit: r1452306 - in
/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine:
notes.md src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
Author: brett
Date: Mon Mar 4 13:54:09 2013
New Revision: 1452306
URL: http://svn.apache.org/r1452306
Log:
[NPANDAY-578] correct resolution logic
MSBuild has a second target that will override other paths, which is how the reference assemblies are found.
Included that in the process, and corrected some logic to ensure all the relevant versions are consulted.
Modified:
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/notes.md Mon Mar 4 13:54:09 2013
@@ -200,15 +200,9 @@ certain characteristics.
The reference resolution now mostly matches that of MSBuild, after first
checking the local Maven repository.
-This may still yield different results to Visual Studio, which looks
-primarily at Reference Assemblies at design time. If we moved to .Net 4.0 we
-would be able to more easily use the Microsoft.Build.Utilities to lookup both
-the framework libraries (Which currently use reflection), and the reference
-assemblies (through a similar method in ToolLocationHelper).
-
-In either case, these lookups should just be done to validate the artifact
-exists somewhere. They should not be put into the POM in either case as that
-reduced portability.
+These lookups should just be done to validate the artifact exists somewhere.
+They should not be put into the POM in either case as that reduced
+portability.
Ideally, such dependencies could be marked as `provided` instead, and
NPanday's own resolution should be able to lookup the correct framework
Modified: incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs?rev=1452306&r1=1452305&r2=1452306&view=diff
==============================================================================
--- incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs (original)
+++ incubator/npanday/trunk/dotnet/assemblies/NPanday.ProjectImporter/Engine/src/main/csharp/Converter/Algorithms/AbstractPomConverter.cs Mon Mar 4 13:54:09 2013
@@ -753,7 +753,7 @@ namespace NPanday.ProjectImporter.Conver
// (1) Files from current project - indicated by {CandidateAssemblyFiles}
// (2) $(ReferencePath) - the reference path property, which comes from the .USER file.
// (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
- // (4) The directory of MSBuild's "target" runtime from GetFrameworkPath.
+ // (4) The directory of MSBuild's "target" runtime from GetReferenceAssemblyPaths (if applicable) and GetFrameworkPath (<= 3.5).
// The "target" runtime folder is the folder of the runtime that MSBuild is a part of.
// (5) Registered assembly folders, indicated by {Registry:*,*,*}
// (6) Legacy registered assembly folders, indicated by {AssemblyFolders}
@@ -779,11 +779,11 @@ namespace NPanday.ProjectImporter.Conver
// resolve from target framework directories
if (refDependency == null && projectDigest.DependencySearchConfig.SearchFramework)
- refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkDirectories());
+ refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkDirectories(), "target framework");
// resolve from registered assembly directories
if (refDependency == null && projectDigest.DependencySearchConfig.SearchReferenceAssemblies)
- refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkAssemblyFoldersEx());
+ refDependency = ResolveDependencyFromDirectories(reference, GetTargetFrameworkAssemblyFoldersEx(), "extra assembly folder");
// resolve from GAC
if (refDependency == null && projectDigest.DependencySearchConfig.SearchGac)
@@ -800,18 +800,25 @@ namespace NPanday.ProjectImporter.Conver
Dictionary<string,string> directories = new Dictionary<string,string>();
RegistryKey root = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\" + projectDigest.TargetFrameworkIdentifier);
- bool found = false;
- foreach (string key in root.GetSubKeyNames())
+
+ if (projectDigest.TargetFrameworkVersion == "v4.0")
{
- if (key.StartsWith(projectDigest.TargetFrameworkVersion))
- {
- RegistryKey assemblyFolderEx = root.OpenSubKey(key + "\\AssemblyFoldersEx");
- GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, assemblyFolderEx);
- found = true;
- }
+ GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v4.0.30319\\AssemblyFoldersEx"));
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5")
+ {
+ GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v3.5\\AssemblyFoldersEx"));
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+ {
+ GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v3.0\\AssemblyFoldersEx"));
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+ {
+ GetTargetFrameworkDirectoriesAssemblyFoldersEx(directories, root.OpenSubKey("v2.0.50727\\AssemblyFoldersEx"));
}
- if (!found)
+ if (directories.Count == 0)
log.WarnFormat("No AssemblyFoldersEx registry key found for {0} {1}", projectDigest.TargetFrameworkIdentifier, projectDigest.TargetFrameworkVersion);
return directories;
@@ -819,18 +826,21 @@ namespace NPanday.ProjectImporter.Conver
protected static void GetTargetFrameworkDirectoriesAssemblyFoldersEx(Dictionary<string, string> targetFrameworkDirectories, RegistryKey assemblyFolderEx)
{
- foreach (string key in assemblyFolderEx.GetSubKeyNames())
+ if (assemblyFolderEx != null)
{
- string v = (string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
- if (v != null)
+ foreach (string key in assemblyFolderEx.GetSubKeyNames())
{
- // strip non-alphanumeric characters to make a property
- targetFrameworkDirectories.Add(new Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+ string v = (string)assemblyFolderEx.OpenSubKey(key).GetValue(null);
+ if (v != null)
+ {
+ // strip non-alphanumeric characters to make a property
+ targetFrameworkDirectories.Add(new Regex("[^A-Za-z0-9]").Replace(key, ""), v);
+ }
}
}
}
- private Dependency ResolveDependencyFromDirectories(Reference reference, Dictionary<string, string> directories)
+ private Dependency ResolveDependencyFromDirectories(Reference reference, Dictionary<string, string> directories, string label)
{
foreach (KeyValuePair<string, string> entry in directories)
{
@@ -847,8 +857,8 @@ namespace NPanday.ProjectImporter.Conver
WarnNonPortableReference(path, refDependency);
- log.DebugFormat("Resolved {0} from target framework directories: {1}:{2}:{3}",
- reference.Name, refDependency.groupId, refDependency.artifactId, refDependency.version);
+ log.DebugFormat("Resolved {0} from {1} directories: {2}:{3}:{4}",
+ reference.Name, label, refDependency.groupId, refDependency.artifactId, refDependency.version);
return refDependency;
}
}
@@ -895,33 +905,46 @@ namespace NPanday.ProjectImporter.Conver
{
// TODO: add support for WinFX, which adds: $(CLR_REF_PATH) and $(WinFXAssemblyDirectory) (constructed by an MSBuild task)
// TODO: add support for CompactFramework, which overwrites with the output of the GetDeviceFrameworkPath MSBuild task
+ // TODO: may need to accommodate design-time facades which have special treatment in MSBuild
Dictionary<string, string> targetFrameworkDirectories = new Dictionary<string, string>();
if (projectDigest.TargetFrameworkVersion == "v4.0")
- AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version40", "Framework40");
- else if (projectDigest.TargetFrameworkVersion == "v3.5")
+ {
+ // v4.0 overrides the path to just include the reference assemblies
+ AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version40", "FrameworkRef40");
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5")
+ {
+ AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version35", "FrameworkRef35");
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version35", "Framework35");
- else if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0")
+ {
+ AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkReferenceAssemblies", "Version30", "FrameworkRef30");
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version30", "Framework30");
- else if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+ }
+ if (projectDigest.TargetFrameworkVersion == "v3.5" || projectDigest.TargetFrameworkVersion == "v3.0" || projectDigest.TargetFrameworkVersion == "v2.0")
+ {
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version20", "Framework20");
- else if (projectDigest.TargetFrameworkVersion == "v1.1")
+ }
+ if (projectDigest.TargetFrameworkVersion == "v1.1")
+ {
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFramework", "Version11", "Framework11");
- else
+ }
+
+ if (targetFrameworkDirectories.Count == 0)
+ {
log.WarnFormat("Unsupported framework version for determining target framework directories: {0}", projectDigest.TargetFrameworkVersion);
+ }
// Add SDK directory
if (projectDigest.TargetFrameworkVersion == "v4.0")
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version40", "FrameworkSdk40");
else if (projectDigest.TargetFrameworkVersion == "v3.5")
AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version35", "FrameworkSdk35");
- else if (projectDigest.TargetFrameworkVersion == "v3.0")
- AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version30", "FrameworkSdk30");
- else if (projectDigest.TargetFrameworkVersion == "v2.0")
- AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version20", "FrameworkSdk20");
- else if (projectDigest.TargetFrameworkVersion == "v1.1")
- AddTargetFrameworkDirectory(targetFrameworkDirectories, "GetPathToDotNetFrameworkSdk", "Version11", "FrameworkSdk11");
+ // Version30 is unsupported for this call
+ // no value for SDK 2.0
log.InfoFormat("Target framework directories: {0}", string.Join(",", new List<string>(targetFrameworkDirectories.Values).ToArray()));
TargetFrameworkDirectories = targetFrameworkDirectories;