示例#1
0
        /// <summary>
        /// 更改命令行传入内容,用于方便接入后续步骤
        /// </summary>
        /// <param name="args"></param>
        private static void MagicTransformMultiTargetingToFirstTarget(string[] args)
        {
            var argDict = dotnetCampus.Cli.CommandLine.Parse(args).ToDictionary(
                x => x.Key,
                x => x.Value?.FirstOrDefault()?.Trim());
            var targetFrameworks = argDict["TargetFrameworks"];

            if (targetFrameworks != null && !string.IsNullOrWhiteSpace(targetFrameworks))
            {
                // 这里必须考虑如下情况

                /*
                 * <TargetFrameworks>netcoreapp3.1;net45;net6.0</TargetFrameworks>
                 *
                 * <PackageReference Include="dotnetCampus.SourceYard" Version="0.1.19393-alpha10" Condition="'$(TargetFramework)'=='net45'">
                 *     <PrivateAssets>all</PrivateAssets>
                 *     <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
                 * </PackageReference>
                 */
                // 为什么只有 net45 才安装?原因是只有单个框架打包才有此需求
                // 此时就不合适获取首个,而是应该获取有带打包的

                string?firstTargetFramework = null;

                var multiTargetingPackageInfoFolder = argDict["MultiTargetingPackageInfoFolder"];
                if (multiTargetingPackageInfoFolder != null && !string.IsNullOrEmpty(multiTargetingPackageInfoFolder) &&
                    Directory.Exists(multiTargetingPackageInfoFolder))
                {
                    var multiTargetingPackageInfo =
                        new MultiTargetingPackageInfo(new DirectoryInfo(multiTargetingPackageInfoFolder),
                                                      targetFrameworks);
                    firstTargetFramework = multiTargetingPackageInfo.ValidTargetFrameworkPackageInfoList.FirstOrDefault()?.TargetFramework;
                }
                if (string.IsNullOrEmpty(firstTargetFramework))
                {
                    firstTargetFramework = targetFrameworks.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
                }

                if (!string.IsNullOrWhiteSpace(firstTargetFramework))
                {
                    for (int i = 0; i < args.Length; i++)
                    {
                        args[i] = args[i].Replace("\\SourcePacking\\", $"\\{firstTargetFramework}\\SourcePacking\\");
                    }
                }
            }
        }
示例#2
0
        /// <summary>
        /// 获取通用的 SourcePacking 文件夹,无视框架版本的不同
        /// </summary>
        /// <returns></returns>
        private static DirectoryInfo GetCommonSourcePackingFolder(MultiTargetingPackageInfo multiTargetingPackageInfo, Logger logger)
        {
            // 获取时,需要判断文件夹是否合法
            var fileList = multiTargetingPackageInfo.ValidTargetFrameworkPackageInfoList;

            if (fileList.Count == 0)
            {
                logger.Error($"Can not find any TargetFramework info file from \"{multiTargetingPackageInfo.MultiTargetingPackageInfoFolder.FullName}\"");
                Exit(-1);
            }

            // 如果是单个框架的项目,那么返回即可
            if (fileList.Count == 1)
            {
                return(fileList[0].SourcePackingFolder);
            }
            else
            {
                return(fileList[0].SourcePackingFolder);
            }
        }
示例#3
0
        private static string GetIntermediateDirectory(MultiTargetingPackageInfo multiTargetingPackageInfo, Options options, Logger logger)
        {
            // 多框架和单个框架的逻辑不相同
            var folder = options.MultiTargetingPackageInfoFolder;

            folder = Path.GetFullPath(folder);
            const string packageName = "Package";

            if (string.IsNullOrWhiteSpace(options.TargetFrameworks))
            {
                // 单个框架的项目
                var sourcePackingFolder = GetCommonSourcePackingFolder(multiTargetingPackageInfo, logger);
                // 预期是输出 obj\Debug\SourcePacking\Package 文件
                var intermediateFolder = Path.Combine(sourcePackingFolder.FullName, packageName);
                return(intermediateFolder);
            }
            else
            {
                // 多个框架的项目
                // 输出 obj\Debug\SourceYardMultiTargetingPackageInfoFolder\Package 文件夹
                return(Path.Combine(folder, packageName));
            }
        }
示例#4
0
        public Packer
        (
            string projectFile,
            string intermediateDirectory,
            string packageOutputPath,
            string packageVersion,
            string?packageId,
            BuildProps buildProps,
            DirectoryInfo commonSourcePackingFolder,
            MultiTargetingPackageInfo multiTargetingPackageInfo,
            Logger logger
        )
        {
            Logger = logger;

            Logger.Message(message: "初始化打包");

            if (string.IsNullOrEmpty(value: projectFile) || !File.Exists(path: projectFile))
            {
                Logger.Error(message: $"无法从{projectFile}找到项目文件");
                return;
            }

            if (string.IsNullOrEmpty(value: intermediateDirectory))
            {
                // 这时的文件夹可以不存在
                Logger.Error(message: "无法解析文件夹 " + intermediateDirectory);
                return;
            }

            if (string.IsNullOrEmpty(value: packageOutputPath))
            {
                Logger.Error(message: "打包输出文件夹不能为空");
                return;
            }

            if (string.IsNullOrEmpty(value: packageVersion))
            {
                Logger.Error(message: "打包版本不能为空");
                return;
            }

            _projectFile               = Path.GetFullPath(path: projectFile);
            _intermediateDirectory     = Path.GetFullPath(path: intermediateDirectory);
            _packageOutputPath         = Path.GetFullPath(path: packageOutputPath);
            _packageVersion            = packageVersion;
            _multiTargetingPackageInfo = multiTargetingPackageInfo;
            BuildProps = buildProps;
            PackageId  = packageId;

            PackagedProjectFile = new PackagedProjectFile
                                  (
                commonSourcePackingFolder,
                //compileFile: GetFile(file: compileFile),
                //resourceFile: GetFile(file: resourceFile),
                //contentFile: GetFile(file: contentFile),
                //embeddedResource: GetFile(file: embeddedResource),
                //page: GetFile(file: page),
                //applicationDefinition: GetFile(file: applicationDefinition),
                //noneFile: GetFile(file: noneFile),
                projectFolder: Path.GetDirectoryName(path: _projectFile) !,
                buildProps: buildProps
                                  );

            _packers = new IPackFlow[]
            {
                new SourcePacker(),
                new AssetsPacker(),
                new ItemGroupPacker(),
                new NuspecFileGenerator(),
                new NuGetPacker(),
            };

            Logger.Message(message: "初始化打包完成");
        }
示例#5
0
        private static void RunOptionsAndReturnExitCode(Options options)
        {
#if DEBUG
            Debugger.Launch();
            Console.WriteLine(Environment.CommandLine);
#endif
            var logger = new Logger();

            FixOptions(options);

            try
            {
                logger.Message("Source packaging");

                var projectFile = options.ProjectFile;
                var multiTargetingPackageInfo = new MultiTargetingPackageInfo(options);
                var intermediateDirectory     = GetIntermediateDirectory(multiTargetingPackageInfo, options, logger);
                // 当前多个不同的框架引用不同的文件还不能支持,因此随意获取一个打包文件夹即可
                // 为什么?逻辑上不好解决,其次,安装的项目的兼容性无法处理
                // 安装的项目的兼容性无法处理?源代码包有 net45 框架,项目是 net47 框架,如何让项目能兼容使用到 net45 框架?当前没有此生成逻辑
                var sourcePackingFolder = GetCommonSourcePackingFolder(multiTargetingPackageInfo, logger);
                var packageOutputPath   = options.PackageOutputPath;
                var packageVersion      = options.PackageVersion;

                //                logger.Message($@"项目文件 {projectFile}
                //临时文件{intermediateDirectory}
                //输出文件{packageOutputPath}
                //版本{packageVersion}
                //编译的文件{options.CompileFile}
                //资源文件{options.ResourceFile}
                //内容{options.ContentFile}
                //页面{options.Page}
                //SourcePackingDirectory: {options.SourcePackingDirectory}");

                var description = ReadFile(options.DescriptionFile);
                var copyright   = ReadFile(options.CopyrightFile);

                var buildProps = new BuildProps(logger)
                {
                    Authors     = options.Authors ?? string.Empty,
                    Company     = options.Company ?? string.Empty,
                    Owner       = options.Owner ?? options.Authors ?? string.Empty,
                    Copyright   = copyright,
                    Description = description,
                    //PackageProjectUrl = options.PackageProjectUrl,
                    //RepositoryType = options.RepositoryType,
                    //RepositoryUrl = options.RepositoryUrl,
                    Title               = options.Title,
                    PackageIconUrl      = options.PackageIconUrl,
                    PackageLicenseUrl   = options.PackageLicenseUrl,
                    PackageReleaseNotes = options.PackageReleaseNotesFile,
                    PackageTags         = options.PackageTags
                };

                buildProps.SetSourcePackingDirectory(sourcePackingFolder.FullName);

                var packer = new Packer
                             (
                    projectFile: projectFile,
                    intermediateDirectory: intermediateDirectory,
                    packageOutputPath: packageOutputPath,
                    packageVersion: packageVersion,
                    // 不再从 options 读取,多个框架的情况下,需要各自获取
                    //compileFile: options.CompileFile,
                    //resourceFile: options.ResourceFile,
                    //contentFile: options.ContentFile,
                    //page: options.Page,
                    //applicationDefinition: options.ApplicationDefinition,
                    //noneFile: options.None,
                    //embeddedResource: options.EmbeddedResource,
                    packageId: options.PackageId,
                    buildProps: buildProps,
                    commonSourcePackingFolder: sourcePackingFolder,
                    multiTargetingPackageInfo: multiTargetingPackageInfo,
                    // 多框架下,每个框架有自己的引用路径
                    //packageReferenceVersion: options.PackageReferenceVersion
                    logger: logger
                             );

                packer.Pack();
            }
            catch (Exception e)
            {
                logger.Error(e.Message);
            }

            string ReadFile(string?file)
            {
                if (string.IsNullOrEmpty(file))
                {
                    return("");
                }

                file = Path.GetFullPath(file !);
                if (File.Exists(file))
                {
                    try
                    {
                        return(File.ReadAllText(file));
                    }
                    catch (Exception e)
                    {
                        logger.Error(e.Message);
                    }
                }

                return("");
            }
        }