public ServiceFabricServiceProject ReadXml(ServiceFabricServiceProject project, string buildOutputPath) { var document = new XmlDocument(); var rawXml = File.ReadAllText(project.SourceServiceManifestPath); document.LoadXml(rawXml); var nsManager = new XmlNamespaceManager(document.NameTable); nsManager.AddNamespace("x", "http://schemas.microsoft.com/2011/01/fabric"); project.ServiceName = document.GetSingleValue("//x:ServiceManifest/@Name", nsManager); project.ServiceVersion = document.GetSingleValue("//x:ServiceManifest/@Version", nsManager); var codePackage = GetPackageInfo("CodePackage", PackageType.Code, project, document, nsManager); codePackage.Path = buildOutputPath; project.SubPackages.Add(codePackage); var configPackage = GetPackageInfo("ConfigPackage", PackageType.Config, project, document, nsManager); project.SubPackages.Add(configPackage); var dataPackage = GetPackageInfo("DataPackage", PackageType.Data, project, document, nsManager); if (!string.IsNullOrWhiteSpace(dataPackage.Name)) { project.SubPackages.Add(dataPackage); } return(project); }
private Dictionary <string, ServiceFabricServiceProject> ExtractProjectReferences( string basePath, string buildOutputPathSuffix, XmlNode document, XmlNamespaceManager namespaceManager) { var projectReferences = new Dictionary <string, ServiceFabricServiceProject>(); var projects = document.SelectNodes("//x:ProjectReference/@Include", namespaceManager); foreach (var service in projects) { if (!(service is XmlAttribute)) { continue; } var attr = service as XmlAttribute; var projectFile = new FileInfo(Path.Combine(basePath, attr.Value)); var serviceProject = new ServiceFabricServiceProject { ProjectFolder = projectFile.Directory, ProjectFile = projectFile }; // TODO Ugly Asp.Net hack thing. ServiceFabricServiceProject projectInfo; string buildOutputPath; var projectFileContents = File.ReadAllText(projectFile.FullName, System.Text.Encoding.UTF8); if (projectFileContents.Contains("<Project Sdk=\"Microsoft.NET.Sdk.Web\">")) { var loader = new ManifestLoader <CoreProjectFile>(false); var projectModel = loader.Load(projectFile.FullName); var propertyGroup = projectModel.PropertyGroup[0]; buildOutputPath = Path.Combine(serviceProject.ProjectFolder.FullName, "bin", _baseConfig.BuildConfiguration, propertyGroup.TargetFramework, propertyGroup.RuntimeIdentifiers[0]); projectInfo = _appManifestHandler.ReadXml(serviceProject, buildOutputPath); projectInfo.IsAspNetCore = true; } else { buildOutputPath = Path.Combine(serviceProject.ProjectFolder.FullName, buildOutputPathSuffix); projectInfo = _appManifestHandler.ReadXml(serviceProject, buildOutputPath); projectInfo.IsAspNetCore = false; } projectReferences.Add(projectInfo.ServiceName, projectInfo); } return(projectReferences); }
private static void CopyServiceManifest(ServiceFabricServiceProject service, DirectoryInfo basePackagePath) { var servicePackageFolder = service.GetServicePackageFolder(basePackagePath); if (!servicePackageFolder.Exists) { servicePackageFolder.Create(); } File.Copy(service.SourceServiceManifestPath, service.GetServiceManifestTargetFile(servicePackageFolder).FullName); }
private static SubPackage GetPackageInfo( string packageName, PackageType packageType, ServiceFabricServiceProject project, XmlNode document, XmlNamespaceManager nsManager) { var name = document.GetSingleValue($"//x:{packageName}/@Name", nsManager); var configPackage = new SubPackage { Name = name, Version = document.GetSingleValue($"//x:{packageName}/@Version", nsManager), PackageType = packageType, Path = Path.Combine(project.PackageRoot.FullName, name) }; return(configPackage); }
private Dictionary <string, ServiceFabricServiceProject> DiscoverAndReadGuestExecutables(ServiceFabricApplicationProject sfProject) { var result = new Dictionary <string, ServiceFabricServiceProject>(); var guests = _packageConfig.GuestExecutables.Where(x => x.ApplicationTypeName.Equals(sfProject.ApplicationTypeName, StringComparison.CurrentCultureIgnoreCase)); foreach (var guest in guests) { var serviceProject = new ServiceFabricServiceProject { IsAspNetCore = false, ProjectFolder = new DirectoryInfo(Path.Combine(_baseConfig.SourcePath.FullName, guest.PackageName)), ProjectFile = null, PackageRoot = new DirectoryInfo(Path.Combine(_baseConfig.SourcePath.FullName, guest.PackageName)), }; var finalProject = _appManifestHandler.ReadXml(serviceProject, Path.Combine(serviceProject.ProjectFolder.FullName, "Code")); finalProject.IsGuestExecutable = true; result.Add(guest.PackageName, finalProject); } return(result); }
private async Task PackageFiles( ServiceFabricApplicationProject appData, ServiceFabricServiceProject serviceProject, KeyValuePair <string, GlobalVersion> service) { var appPackagePath = appData.GetPackagePath(_baseConfig.PackageOutputPath); var servicePackagePath = serviceProject.GetServicePackageFolder(appPackagePath); DirectoryInfo directory; IEnumerable <FileInfo> files; var package = serviceProject.SubPackages .First(x => x.PackageType == service.Value.PackageType); var extraFiles = _packageConfig .ExternalIncludes .Where(x => x .ApplicationTypeName.Equals(appData.ApplicationTypeName, StringComparison.CurrentCultureIgnoreCase)) .Where(x => x .ServiceManifestName.Equals(serviceProject.ServiceName, StringComparison.CurrentCultureIgnoreCase)) .Where(x => x .PackageName.Equals(package.Name, StringComparison.CurrentCultureIgnoreCase)); if (service.Value.PackageType == PackageType.Code) { if (!serviceProject.IsGuestExecutable) { directory = new DirectoryInfo(Path.Combine(serviceProject.ProjectFolder.FullName, appData.BuildOutputPathSuffix)); files = directory .GetFiles("*", SearchOption.AllDirectories) .Where(x => _packageConfig.HashIncludeExtensions.Any(include => x.FullName.ToLowerInvariant().EndsWith(include.ToLowerInvariant()))) .Select(x => x.FullName) .OrderBy(x => x) .Select(x => new FileInfo(x)); } else { directory = new DirectoryInfo(Path.Combine(serviceProject.ProjectFolder.FullName, "Code")); files = directory .GetFiles("*", SearchOption.AllDirectories) .Select(x => x.FullName) .OrderBy(x => x) .Select(x => new FileInfo(x)); } } else { directory = new DirectoryInfo(Path.Combine(serviceProject.PackageRoot.FullName, package.Name)); files = directory .GetFiles("*", SearchOption.AllDirectories) .Select(x => x.FullName) .OrderBy(x => x) .Select(x => new FileInfo(x)); } var basePathLength = directory.FullName.Length; var subPackageFolder = package.GetSubPackageTargetPath(servicePackagePath); if (!subPackageFolder.Exists) { subPackageFolder.Create(); } foreach (var file in files) { var relPath = file.FullName.Remove(0, basePathLength + 1); var targetFile = new FileInfo(Path.Combine(subPackageFolder.FullName, relPath)); if (!Directory.Exists(targetFile.DirectoryName)) { Directory.CreateDirectory(targetFile.DirectoryName); } File.Copy(file.FullName, targetFile.FullName); } foreach (var externalFile in extraFiles) { var file = await _fileHandler .GetFileAsBytesAsync(externalFile.SourceFileName) .ConfigureAwait(false); if (!file.IsSuccessful) { throw new IOException("Failed to get external file from storage"); } File.WriteAllBytes(Path.Combine(subPackageFolder.FullName, externalFile.TargetFileName), file.ResponseContent); } }