Ich möchte ein NuGet-Paket programmgesteuert in ein Projekt installieren und die .csproj
-Datei und die packages.config
-Datei aktualisieren.Wie programmiere ich ein NuGet-Paket?
ich den offiziellen Nuget.core
Rahmen bin mit der Source-Code verfügbar ist hier: https://github.com/NuGet/NuGet2
Ich bin nicht das NuGet Paket mit: https://www.nuget.org/packages/NuGet.Core/ Aber der Quellcode auf GitHub gefunden Lage sein, einige Debug zu tun.
Anmerkung: Ich bin mit der Version
2.11
und nicht die2.13
ich in der Lage bin ein Paket in einem gewünschten Verzeichnis zum Herunterladen und Aktualisieren der packages.config
Datei:
// ---- Download and install a package at a desired path ----
string packageID = "Newtonsoft.json";
var sourceUri = new Uri("https://packages.nuget.org/api/v2");
// Return an IPackage
var package = GetNugetPackage(packageID, sourceUri);
IPackageRepository sourceRepository = PackageRepositoryFactory.Default.CreateRepository(sourceUri.ToString());
string packagesPath = "../../TestFiles/packages";
PackageManager packageManager = new PackageManager(sourceRepository, packagesPath);
packageManager.InstallPackage(packageID, SemanticVersion.Parse(package.Version.ToFullString()));
// ---- Update the ‘packages.config’ file ----
var packageReferenceFile = new PackageReferenceFile("../../TestFiles/packages.config");
// Get the target framework of the current project to add --> targetframework="net452" attribute in the package.config file
var currentTargetFw = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(TargetFrameworkAttribute), false);
var targetFrameworkAttribute = ((TargetFrameworkAttribute[])currentTargetFw).FirstOrDefault();
// Update the packages.config file
packageReferenceFile.AddEntry(package.GetFullName(), SemanticVersion.Parse(package.Version.ToFullString()), false, new FrameworkName(targetFrameworkAttribute.FrameworkName));
Jetzt Ich muss die .csproj
aktualisieren und hier ist der knifflige Teil ...
Hier ist, was ich bisher versucht:
string csprojFilePath = "../../TestFiles/test.csproj";
var project = new MSBuildProjectSystem(csprojFilePath);
string pathToAnExistingNugetPackageDll = "../../TestFiles/packages/Newtonsoft.json/lib/net45/Newtonsoft.json.dll"
project.AddReference(pathToAnExistingNugetPackageDll, Stream.Null);
project.Save();
Dieses Stück Code-Update die .csproj
Datei, eine neue reference
Knoten wie folgt hinzu:
<Reference Include="Newtonsoft.json">
<HintPath>..\packages\Newtonsoft.json\lib\net45\Newtonsoft.json.dll</HintPath>
</Reference>
Aber ich brauche eine komplettereference
Knoten wie folgt:
<Reference Include="Newtonsoft.json, Version=9.0.8, Culture=neutral, PublicKeyToken=b03f4f7d11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.json\lib\net45\Newtonsoft.json.dll</HintPath>
<Private>True</Private>
</Reference>
Wie kann ich das tun?
Sie müssen die Referenz selbst mit Ihrem eigenen Code generieren. Dieser spezielle Referenzstil wird von Visual Studio und nicht von NuGet generiert. NuGet generiert den Verweis mit einem Include-Attribut, das nicht den vollständigen Assemblynamen verwendet. –
Ich habe eine Klasse gefunden, die den Trick in der Core-Assembly zu tun scheint: 'RemoteAssembly' scheint meine benötigten Attribute zu laden ... Ich werde es versuchen – Thomas