精华内容
下载资源
问答
  • java web 项目打包、加密工具

    热门讨论 2012-06-18 17:08:17
    Jinstall打包工具通过对class文件进行256位高强度加密,对您的项目进行绝对安全的保护。通过将web项目整合到一个exe文件中,实现加密、打包、安装一步到位。真正做到了安全、简单、方便! ----------------------...
  • **Web应用的一键发布程序** 前段时间刚到公司上班,上级给了一个任务用于试用期测试和转正述职前提。需求如下:制作一个web应用的一键发布发布程序,要求...所以我最想到的就是利用支持VS的打包工具来实现将系统界面和
                       **Web应用的一键发布程序**
    前段时间刚到公司上班,上级给了一个任务用于试用期测试和转正述职前提。需求如下:制作一个web应用的一键发布发布程序,要求能自动检测安装IIS,应用所需插件,还原数据库(sql server)备份文件和执行更新SQL。
    
    先说一下我的思路:
    由于我们公司的客户都试用WINDOWS的系统,我们开发工具是vs2015。所以我最想到的就是利用支持VS的打包工具来实现将系统界面和我自定义界面结合来实现这个安装程序。
    我最先使用的是VS开发工具建议使用的InstallShield-Limited-Edition这个打包插件。研究了一下发现这个插件的界面比较的美观也有一定的用户自定义功能,各种定制选项也比较完善;但是我发现他不能实现用户自定义界面(例如:WinForm)和工具所提供的见面组合,无法满足我的要求最后放弃了。后来改用了微软自己的打包工具visual studio installer这个工具能够实现我的所有需求。
    这个工具安装完成之后VS工具里面就会出现相应的工程。
    [如图](https://img-blog.csdn.net/20170725164849927?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzA2OTcwMTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
     有了这个东东之后我们就可以开始接下来的操作了!!首先需要创建一个安装工程,如上图这个工具可以打包桌面应用程序,也可以打包发布WEB应用。由于我所发布的程序的特殊性(混合程序),我就选用了桌面应用程序的(Setup project)。最基础的自定义要求如图[这里写图片描述](https://img-blog.csdn.net/20170725170700378?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzA2OTcwMTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast),这个工具的使用方式你们可以参考一下这位道友的文章(http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html)。自定义安装程序你需要2个最基础的工程第一个当然就是 安装打包工程(Setup project);另一个是自定义界面和处理逻辑需要使用的类库工程(创建最普通的类库工程就好)然后删除点里面的默认class.cs文件,新建一个安装类。如图[就是他](https://img-blog.csdn.net/20170725172115114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzA2OTcwMTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)这个类就是系统的安装逻辑和你自定义的逻辑连接的中间点。在这个类里面你可以自定义安装,修复,卸载。。。。所需要使用的特殊逻辑和界面。这个类的具体使用方法我就不详细说明了,网上一大推说明。
    ![安装描述](https://img-blog.csdn.net/20170725172840560?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzA2OTcwMTc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
     如图就是我在系统安装步骤结束之后打开了一个我自定义的界面,后面的步骤就是同学们最熟悉的WINFORM工程的操作了。
     我列举一下比较重要的功能点代码:
    

    1:IIS的检测以及添加网站、应用池、重启指定网站等等

     using Microsoft.Web.Administration;
    using System;
    using System.Collections.Generic;
    using System.DirectoryServices;
    using System.Linq;
    
    namespace SetupLibrary
    {
        /// <summary>
        /// IIS 操作方法集合
        /// http://blog.csdn.net/ts1030746080/article/details/8741399 错误
        /// </summary>
        public class IISTools
        {
            private static string HostName = "localhost";
    
            /// <summary>
            /// 获取本地IIS版本
            /// </summary>
            /// <returns></returns>
            public static string GetIIsVersion()
            {
                try
                {
                    DirectoryEntry entry = new DirectoryEntry("IIS://" + HostName + "/W3SVC/INFO");
                    string version = entry.Properties["MajorIISVersionNumber"].Value.ToString();
                    return version;
                }
                catch (Exception se)
                {
                    //说明一点:IIS5.0中没有(int)entry.Properties["MajorIISVersionNumber"].Value;属性,将抛出异常 证明版本为 5.0
                    return string.Empty;
                }
            }
    
            /// <summary>
            /// 创建虚拟目录网站
            /// </summary>
            /// <param name="webSiteName">网站名称</param>
            /// <param name="physicalPath">物理路径</param>
            /// <param name="domainPort">站点+端口,如192.168.1.23:90</param>
            /// <param name="isCreateAppPool">是否创建新的应用程序池</param>
            /// <returns></returns>
            public static int CreateWebSite(string webSiteName, string physicalPath, string domainPort, bool isCreateAppPool)
            {
    
    
                DirectoryEntry root = new DirectoryEntry("IIS://" + HostName + "/W3SVC");
                // 为新WEB站点查找一个未使用的ID
                int siteID = 1;
                foreach (DirectoryEntry e in root.Children)
                {
                    if (e.SchemaClassName == "IIsWebServer")
                    {
                        int ID = Convert.ToInt32(e.Name);
                        if (ID >= siteID) { siteID = ID + 1; }
                    }
                }
                // 创建WEB站点
                DirectoryEntry site = (DirectoryEntry)root.Invoke("Create", "IIsWebServer", siteID);
                site.Invoke("Put", "ServerComment", webSiteName);
                site.Invoke("Put", "KeyType", "IIsWebServer");
                site.Invoke("Put", "ServerBindings", domainPort + ":");
                site.Invoke("Put", "ServerState", 2);
                site.Invoke("Put", "FrontPageWeb", 1);
                site.Invoke("Put", "DefaultDoc", "Default.html");
                // site.Invoke("Put", "SecureBindings", ":443:");
                site.Invoke("Put", "ServerAutoStart", 1);
                site.Invoke("Put", "ServerSize", 1);
                site.Invoke("SetInfo");
                // 创建应用程序虚拟目录
    
                DirectoryEntry siteVDir = site.Children.Add("Root", "IISWebVirtualDir");
                siteVDir.Properties["AppIsolated"][0] = 2;
                siteVDir.Properties["Path"][0] = physicalPath;
                siteVDir.Properties["AccessFlags"][0] = 513;
                siteVDir.Properties["FrontPageWeb"][0] = 1;
                siteVDir.Properties["AppRoot"][0] = "LM/W3SVC/" + siteID + "/Root";
                siteVDir.Properties["AppFriendlyName"][0] = "Root";
    
                if (isCreateAppPool)
                {
                    DirectoryEntry apppools = new DirectoryEntry("IIS://" + HostName + "/W3SVC/AppPools");
    
                    DirectoryEntry newpool = apppools.Children.Add(webSiteName, "IIsApplicationPool");
                    newpool.Properties["AppPoolIdentityType"][0] = "4"; //4
                    newpool.Properties["ManagedPipelineMode"][0] = "1"; //0:集成模式 1:经典模式
                    newpool.CommitChanges();
                    siteVDir.Properties["AppPoolId"][0] = webSiteName;
                }
    
                siteVDir.CommitChanges();
                site.CommitChanges();
                return siteID;
            }
    
            /// <summary>
            /// 得到网站的物理路径
            /// </summary>
            /// <param name="rootEntry">网站节点</param>
            /// <returns></returns>
            public static string GetWebsitePhysicalPath(DirectoryEntry rootEntry)
            {
                string physicalPath = "";
                foreach (DirectoryEntry childEntry in rootEntry.Children)
                {
                    if ((childEntry.SchemaClassName == "IIsWebVirtualDir") && (childEntry.Name.ToLower() == "root"))
                    {
                        if (childEntry.Properties["Path"].Value != null)
                        {
                            physicalPath = childEntry.Properties["Path"].Value.ToString();
                        }
                        else
                        {
                            physicalPath = "";
                        }
                    }
                }
                return physicalPath;
            }
    
            /// <summary>
            /// 获取站点名
            /// </summary>
            public static List<IISInfo> GetServerBindings()
            {
                List<IISInfo> iisList = new List<IISInfo>();
                string entPath = String.Format("IIS://{0}/w3svc", HostName);
                DirectoryEntry ent = new DirectoryEntry(entPath);
                foreach (DirectoryEntry child in ent.Children)
                {
    
                    if (child.SchemaClassName.Equals("IIsWebServer", StringComparison.OrdinalIgnoreCase))
                    {
                        if (child.Properties["ServerBindings"].Value != null)
                        {
                            object objectArr = child.Properties["ServerBindings"].Value;
                            string serverBindingStr = string.Empty;
                            if (IsArray(objectArr))//如果有多个绑定站点时
                            {
                                object[] objectToArr = (object[])objectArr;
                                serverBindingStr = objectToArr[0].ToString();
                            }
                            else//只有一个绑定站点
                            {
                                serverBindingStr = child.Properties["ServerBindings"].Value.ToString();
                            }
                            IISInfo iisInfo = new IISInfo();
                            iisInfo.DomainPort = serverBindingStr;
                            iisInfo.webname = child.Properties["ServerComment"].Value.ToString();
                            iisInfo.AppPool = child.Properties["AppPoolId"].Value.ToString();//应用程序池
                            iisList.Add(iisInfo);
                        }
                    }
                }
                return iisList;
            }
    
    
    
    
    
            /// <summary>
            /// 建立程序池后关联相应应用程序及虚拟目录
            /// </summary>
            public static void SetAppToPool(string appname, string poolName)
            {
                //获取目录
                DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");
                foreach (DirectoryEntry getentity in getdir.Children)
                {
                    if (getentity.SchemaClassName.Equals("IIsWebServer"))
                    {
                        //设置应用程序程序池 先获得应用程序 在设定应用程序程序池
                        //第一次测试根目录
                        foreach (DirectoryEntry getchild in getentity.Children)
                        {
                            if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))
                            {
                                //找到指定的虚拟目录.
                                foreach (DirectoryEntry getsite in getchild.Children)
                                {
                                    if (getsite.Name.Equals(appname))
                                    {
                                        //【测试成功通过】
                                        getsite.Properties["AppPoolId"].Value = poolName;
                                        getsite.CommitChanges();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            /// <summary>
            /// 根据IIS站点名称重启网站
            /// </summary>
            /// <param name="sitename"></param>
            public static void RestartWEbSite(string sitename)
            {
                try
                {
                    var server = new ServerManager();
                    var site = server.Sites.FirstOrDefault(s => s.Name == sitename);
                    if (site != null)
                    {
                        site.Stop();
                        if (site.State == ObjectState.Stopped)
                        {
                        }
                        else
                        {
    
                        }
                        site.Start();
                    }
                    else
                    {
    
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
    
    
            /// <summary>
            /// 判断object对象是否为数组
            /// </summary>
            public static bool IsArray(object o)
            {
                return o is Array;
            }
        }
    
        /// <summary>
        /// 应用池类
        /// </summary>
        public class IISInfo
        {
            public string DomainPort { set; get; }
            public string AppPool { set; get; }
            public string webname { get; set; }
        }
    }  
    2.IIS的安装
     IIS的安装有点烦,我弄了好久。主要是在网上找的方法所安装的IIS 都有缺陷,最主要的一个就是安装的时候不能默认安装IIS6兼容性功能模块,会导致上面IIS工具类无法正常使用,最后妥协了使用了批处理命令来安装。
    
        @echo off
    echo install iis 
    start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI
    echo install flash
    pause

    3 . 还原数据库备份(bak文件) 和执行SQL脚本文件
    我所采用的方式是直接使用sqlcommand工具类执行还原的SQL语句
    RESTORE DATABASE “+ dbName + ” from DISK =“+dbpath+”WITH REPLACE

       SQL 脚本文件我所使用的方式是利用osql命令:                                   
       osql -S 服务器 -U 用户名 -P 密码 -d 数据库 -i \"SQL文件路径\"" 
    

    4.插件的检测
    我使用的是最基础的注册表检测,这个我就不多说啦。

    我写这个目的是为了对一些以前不了解的东西做一些保留,也希望能帮到你们。以我写的这个东西的可读性和连贯性我估计也帮不到几个人。。。。。。。。

    展开全文
  • 译者按: 新一代Web应用打包工具Parcel横空出世,快速、零配置的特点让人眼前一亮。 原文: Everything You Need To Know About Parcel: The Blazing Fast Web App Bundler �� 译者: Fundebug 为了保证可读性,...

    译者按: 新一代Web应用打包工具Parcel横空出世,快速、零配置的特点让人眼前一亮。

    为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

    这里写图片描述

    Parcel有什么特别的,我为什么要关心它?

    虽然webpack提供了非常多灵活的配置,但是与之带来的是复杂度的提升,而Parcel却非常的简洁。Parcel自己的口号也是非常直白:零配置。

    为什么这么神奇?— Parcel有一个开箱即用的开发服务器。 开发服务器会在您更改文件时自动重建您的应用程序,并支持热模块重载以实现快速开发。

    Parcel有什么好处?

    • 快速捆绑时间 - Parcel比Webpack,Rollup和Browserify更快。

    这里写图片描述

    然而需要注意的是:Webpack仍然很棒,有时可能会更快

    这里写图片描述

    • Parcel支持JS,CSS,HTML,file assets等等,并且不需要插件配置,用户体验更友好。

    • 零配置需要:开箱即用的代码分割,热模块重新加载,css预处理器,开发服务器,缓存等等!

    • 更友好的错误日志。
      这里写图片描述
      这里写图片描述

    Fundebug:及时发现Bug,提高Debug效率!

    什么情况下使用Parcel,Webpack或Rollup?

    其实主要取决于你自己,但我个人会通过以下情况来选择适合的:

    Parcel: 中小型项目(1.5万行代码以内)。
    Webpack: 大型企业规模项目。
    Rollup: 用于NPM包。

    安装非常简单

    npm install parcel-bundler --save-dev

    我们在本地安装了 parcel-bundler的npm包,现在我们需要初始化一个node项目。

    这里写图片描述
    接下来,创建index.htmlindex.js 文件。

    这里写图片描述
    index.htmlindex.js 关连起来。

    这里写图片描述
    这里写图片描述

    最后将parcel脚本添加到我们的package.json

    这里写图片描述

    这就是所有的配置,是不是非常简单。

    接下来,让我们开启服务器。

    这里写图片描述

    这里写图片描述
    效果明显了,大佬们请注意构建时间!

    这里写图片描述
    15ms?! 是不是很牛逼!

    再看一下HMR

    这里写图片描述
    也感觉非常快啊。

    SCSS

    这里写图片描述
    同样先需要装node-sass

    npm i node-sass && touch styles.scss

    接下来,添加一些样式并将styles.scss导入index.js文件。

    这里写图片描述
    这里写图片描述
    这里写图片描述

    生产构建

    我们所需要的只是将一个build脚本添加到我们的package.json

    这里写图片描述
    运行build脚本

    这里写图片描述
    看看Parcel如何让我们的生活变得轻松?

    这里写图片描述
    你可以像这样指定一个特定的build路径:

    parcel build index.js -d build/output

    Fundebug错误实时监控为您的React项目保驾护航!

    React

    这里写图片描述
    设置React非常简单,我们需要做的就是安装我们的依赖并设置我们的.babelrc

    npm install --save react react-dom babel-preset-env babel-preset-react && touch .babelrc

    这里写图片描述
    来写个初始化React组件玩玩吧!

    这里写图片描述
    这里写图片描述

    这里写图片描述

    Fundebug错误实时监控为您的Vue项目保驾护航!

    Vue

    首先安装vueparcel-plugin-vue ,其中parcel-plugin-vue用于.vue组件支持。

    $ npm i --save vue parcel-plugin-vue

    需要添加我们的根元素,导入vue的index文件并初始化Vue。

    首先生成个vue目录,然后创建index.jsapp.vue

    $ mkdir vue && cd vue && touch index.js app.vue

    index.html引用ndex.js

    这里写图片描述
    最后,让我们初始化vue并编写我们的第一个vue组件!

    这里写图片描述
    这里写图片描述

    这里写图片描述

    TypeScript

    这里写图片描述
    这个非常简!只需安装TypeScript,我们就可以开始。

    npm i --save typescript

    创建index.ts文件并将其插入index.html

    这里写图片描述

    这里写图片描述

    这里写图片描述

    推荐

    展开全文
  • web界面打包成桌面程序工具

    千次阅读 2017-06-26 14:58:43
    1、https://zhuanlan.zhihu.com/p/20225295?columnSlug=FrontendMagazine 2、https://segmentfault.com/a/1190000003870613

    1、https://zhuanlan.zhihu.com/p/20225295?columnSlug=FrontendMagazine




    2、https://segmentfault.com/a/1190000003870613

    展开全文
  • Unity自动打包工具

    万次阅读 多人点赞 2014-07-11 21:36:05
    Unity一键打包工具,一键生成几十个平台/渠道的安装包。

        最开始有写打包工具的想法,是因为看到《啪啪三国》王伟峰分享的一张图,他们有一个专门的“工具程序员”开发各种工具。(ps:说起来这个王伟峰和他的创始团队成员,以前跟我是同一个公司的,公司名字就不透露了,只是当时在不同的部门,相互不认识)。正好我们项目也到了后期,该准备接入渠道了。于是,我就着手写我们的打包工具。约定一下,下文中,平台是指操作系统平台,比如iOS、Android、WP8、Metro;渠道是指发布渠道,比如App Store、WP8商店、360、91、小米等。

                               

                                                             上海火溶网络CEO王伟峰分享的《啪啪三国》打包工具

      过程

        从过程上,主要分为以下几步:

        1. 资源准备;

        2. 由Unity生成工程;

        3. 生成安装包;

        4. 资源恢复。

        具体到平台和渠道,会有一些细微差异,下面具体说。

      WP8打包

        这个是第一个写的,因为不涉及渠道,相对来说最简单。从下午4点,写到晚上9点多,时间大部分花在处理一些细节上。

        第一步,资源相关的准备。我们是做了动态更新的,所以生成工程之前,要先从Unity里删去更新的资源,这样打出的包更小。ps:其实这一步之前,我们会先打更新包,关于资源打包与更新,我另写一篇文章介绍。另外,跟各个平台交互,我们写了插件,比如,内嵌web功能,Unity是没有的,要调用系统的api来做。就是这么一个再普通不过的插件,让我花了大量时间处理,因为Unity常常load别的平台目录下的插件。比如,我有一个插件Platform.dll,按照Unity的官方文档,应该放到“Plugins/平台/”目录下,生成WP8工程的时候,Unity应该选择Plugins/WP8/Platform.dll加载;打android包的时候,应该加载Plugins/Android/Platform.dll。但是遗憾的是,Unity不是这样,我打WP8的时候,它常常去加载Android目录下的插件。这个问题的原因,我一直没有查到,希望了解的朋友不吝赐教。为了解决这个问题,我就在打包的时候,把非当前平台目录下的插件删除,打好包之后,再恢复。另外,还要删除上一次打包生成的文件。

        第二步,生成工程。这个没什么好说的,就是Unity的API调用,比如,BuildPipeline.BuildPlayer(BuildScenes, BuildPath, BuildTarget.WP8Player, BuildOptions.None);

        第三步,生成安装包。在生成包之前,要替换一些Unity生成的文件,比如,MainPage.xaml/.cs,因为我们为了操作内嵌web,做了WP8特性的ApplicationBar;我们配置好的WMAppManifest.xml,友盟统计要求初始化必须在App.xaml.cs中,WP8工程Assets/目录下的Icon等。然后,根据需要修改工程文件,比如,我们做了WP8的ApplicationBar,需要在打包工具里把相关的资源索引添加到工程文件中。然后,就可以调用cmd来生成apk安装包了。cmd主要是调用vs的命令,生成apk,调用vs安装目录下的devenv.exe,配置一下devenv.exe的参数就可以了。这里有一个需要注意的地方是,Build选项要选择Master,而不是Release,Release版本有"profiler support",Master才是发布用的。

        第四步,资源恢复。包已经打好了,为了接下来打别的平台或渠道的包,恢复资源。比如,恢复更新的资源、各平台插件等。

      Android打包

        Android打包麻烦一些,不是因为渠道多,而是因为有的渠道有一些特殊需求。过程类似,下面主要说不同的地方。

        第一步,资源相关的准备。跟WP8打包不同的是,Android是多渠道,要处理各个渠道的资源。我最开始把所有渠道sdk相关的资源和代码,都放到Unity的Plugins/目录下面,比如Plugins/Android360、Plugins/Android91、Plugins/AndroidXiaoMi等,每次打包的时候,资源准备阶段先删除所有非当前渠道相关的内容,然后把当前渠道的目录名修改为Plugins/Android,打完包再删除Plugins/Android,然后调用svn update更新所有删除的内容。写完之后,打一个包,ok。当时接了11个渠道,然后我点了一下“Build All”,Build过程很慢,因为有大量的散文件,svn update要几分钟,Unity import进来这些资源也要一些时间。而且,当打到第四、第五个包的时候,Unity import资源的时候,常常会报错,可能是因为磁盘上的文件与Unity的缓存文件之间同步的时候异常。这样打包太慢了,也无法做到一键打几十个包。后来,我想到把所有渠道文件放到Unity Assets目录外,这样,需要哪个sdk就copy进来哪个,打完包delete就可以了,不用svn update,也不需要Unity每次import大量的散文件。打包效率提高了几倍,而且,一键出十几个包,也没有遇到过Unity报错。

        第二步,生成工程。这个地方,我是走了一些弯路的。

        最开始,我没有生成Android工程,而是直接Build出来apk,这样的好处是快。根据测试,3分钟多可以生成一个,而生成工程之后再Build出apk,时间翻了一倍。但是,各个渠道的sdk的特殊性,造成这种方式后来出几次问题。

        第一次,接sdk的同学说,有的渠道要求独立的icon或splash,我想这个简单,用aapt直接操作生成apk,修改里面的内容,然后重新签名就可以了,非常快,又方便。

        第二次,接百度多酷的同学说,用打包工具生成的apk,充值支付的时候,如果选择银联支付,会crash。而先Build出工程,然后用Eclipse编工程生成的apk没问题。我仔细对比了两个apk,发现直接生成的apk里,比工程生成的apk里,res/drawable/目录下少了几个文件,data.bin/data_high.bin/data_low.bin/mobilepayplugin.bin,我怀疑是Unity直接生成apk的时候,过滤掉了这些文件,而生成工程的时候没有过滤。什么原因?这个也好解决,找到缺少的文件,用aapt加进去。后来,当乐、Oppo都需要在打包工具里加入同样的几个bin文件。

        这样解决,不是好方法,但是解决了问题。但是,后来Oppo的同学反馈说,我们的包打开的Oppo登录界面是全屏的,而实际应该是弹出窗口样式。这说明,打包的时候,可能有些界面布局文件,没有打进去。但是,这次,我没法通过对比两种方式生成的apk,找缺少哪个文件了,因为所有的资源文件,都打到resources.arsc里面了。这时,我觉得这种出现问题解决问题的思路是不对的,应该从根本上拒绝出问题。然后,我重新写了Android打包工具,先生成工程,然后用Ant Build出apk。如果哪个渠道有特殊需求,在build apk之前操作工程,比如替换icon、splash。当然,这样做打包过程变成了,慢了一半。

        第三步,生成安装包。这个没什么好说的,就是Ant、sign、zipalign等。另外,我们的运营有一个特殊的需求,他们投放渠道,分两种方式:一种是接渠道sdk,另外一种是只购买流量,不接sdk。针对第二种方式,我打包的时候,只打一个包,然后,为了统计区分投放的渠道,对于生成的这个包,复制一份然后修改包里的配置文件,就可以了,不需要重复生成多次包。这样,十几秒就可以出一个包。我打包工具里的“SPP渠道包”这个按钮,就是是单独生成这种渠道包的。

        第四步,资源恢复。因为WP8就一个渠道,所以打完WP8包,就要直接恢复所有资源。而Android渠道众多,为了更快,有些资源是不需要恢复的,比如我们更新的内容。只需要打完所有Android包之后,恢复一次就可以了。

      iOS打包

        写完WP8和Android打包工具后,我不想再做重复的工作了,就写了一份详细的文档,然后交给一个小伙伴,让他参考WP8和Android的代码,写iOS的打包工具,也是想让他锻炼、学习一下。结果,悲剧无比!!!因为代码是很类似的,而且我给他详细讲了怎么做,iOS也只有3个渠道,他需要写的代码不超过50行,shell脚本估计在30行以内。这个我本来预估1-2天,最多3天可以做完的工作,他要了一周。而最后,他做了一月有余%>_<%

        后来,发现有一个第三方工具,XUPorter,可以方便的编辑framework、plist甚至obj-c代码,有了它再配合写点shell脚本,iOS打包很简单。

      其它

        我最开始写工具的时候,打包操作入口用的是[MenuItem(...)],操作按钮在Unity左上的菜单栏,做出来的打包工具操作界面是这样的:

                         

        我不知道大家有没有发现有什么问题。问题就是:每次加渠道,我都要在代码里添加菜单项,比如,今天添加91渠道,在代码里添加:

        [MenuItem("Build/Build Android Player/91")]
        static void BuildAndroid91Player() {
             // do something ...
        }

        明天添加了360渠道:

        [MenuItem("Build/Build Android Player/360")]
        static void BuildAndroid360Player() {
             // do something ...
        }

        如果有几十个,甚至一两百个渠道怎么办?每次都修改代码?NO!ps:我们公司有一款产品真的接了一百多个渠道。

        但是,在函数之外,如何读配置对C#的属性[MenuItem(...)]做赋值处理?我还抱着一点侥幸查了一些资料,这是根本不可能的。后来,我想起来之前看到的王伟峰分享那张图:

                                        

        这张图虽然很模糊,但是仔细看看,看出来他们的打包工具操作入口,不是在Unity 顶部的菜单栏,而是在Inspector中。了解了在哪里写,实现就很简单了,建一个Prefab就可以了。这样,以后新添加渠道,接入的同学只需要按照我规定的格式,在配置文件里加一行渠道信息就可以了。修改后打包工具操作界面:

            

                                            我们的打包工具操作入口

        Refresh按钮是修改渠道配置文件之后,重新读取配置文件。

        Build Patch下面的几个按钮是打各平台的更新包,动态更新用的AssetBundle。

        Build Player下面按钮式打各平台、各渠道的安装包。可以一键出某个包,或者一键出某平台的所有包。这里我没有做一键出所有平台的包,因为我们没有这个需求。如果要做,出完一个平台的包之后,切换一下平台就可以了(EditorUserBuildSettings.SwitchActiveBuildTarget(xxx)。但是,注意不要Switch之后立即打新平台的包,而应该在回调接口里做,activeBuildTargetChanged


        Unity相关文章:Unity优化总结Unity3D图形性能优化Unity自动打包工具——Mac上打包android

        转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/36774715。作者:夜风。

    展开全文
  • 用VS.net提供的功能对项目打包: 1.打开VS.NET开发环境; 2."文件"->"新建"->"项目"; 3."项目类型"选"安装和部署项目","模板"选"Web安装项目",然后填写"名称"和"位置",最后"确定"; 4.鼠标右击"解决方案",选择"添加"->...
  • 最近因为需求,需要把移动端网页打包成APP,本人一直是做网站开发...而且因为用的是网页开发,跨平台无压力,并且只用维护网站就够了,不得不说,HTML5确实挺牛,不多说,分享一下本人测试过的三款在线打包工具。 ...
  • web前端项目打包

    2019-09-11 15:31:41
    打包工具 Grunt (自动化构建工具) Gulp (自动化构建工具) WubPack (静态资源打包工具) Gulp 通过定义一个个任务来工作(通常每个任务都需要相应插件支持) 把文档通过流的方式操作(减少频繁的IO) 安装 ...
  • 前端打包工具

    千次阅读 2018-08-08 17:19:18
    前端打包工具是一种将前端代码进行转换,压缩以及合并等操作的程序工具。目前常见的grunt,webpack等。 它能将我们前端人员写得less...目前,会使用web前端打包工具是现代前端人员必备技能。 webpack webpack是...
  • Webpack前端打包工具

    千次阅读 2018-12-08 22:58:42
    Webpack 是一个前端资源的打包工具,它可以将js、image、css等资源当成一个模块进行打包。 中文官方网站:https://www.webpackjs.com/ 打包的作用: - 将许多碎小文件打包成一个整体,减少单页面内的衍生请求次数...
  • webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。 我们可以直接使用 require(XXX) 的形式来引入各模块,即使它们...
  • web项目打包成Native App

    千次阅读 2019-07-08 11:34:53
    闲暇时分静下心来给大家分享一下web项目打包成Native App的小知识,最近公司的web项目都开发到收尾阶段了,也在把web项目打包成Android和IOS程序包,我所使用的打包工具是HbuilderX,Xcode也使用,但每次配置的...
  • electron 打包web应用

    万次阅读 2016-04-09 23:05:36
    时下流行的web app打包工具主要两个,一个是国内开发者主导的nw.js,另一个是国外大厂支撑的electron。对比了nw.js以及electron之后还是选择了electron,原因主要以下几点: 1、基于该工具已广泛被使用的产品...
  • 前端打包工具选择

    千次阅读 2018-05-06 11:26:35
    这类要调用手机系统的通知,想学下原生的,但开发要搞两套也太麻烦费事,也挺难学的,想想不如用那些打包的壳子;通过提供的api,调用app系统的东西。然后就找了下面的这些资料。HBuilderHBuilder是DCloud推出的一款...
  • 一、问题阐述   前两天做个java程序,需要将代码打成jar包跑下它的main方法,所以就用了eclipse自带的打包工具将工程打成jar包,结果在运行的时候竟然报错“Caused by: ...查了半天,终于知道问题在于“用...
  • 前端面试——打包工具

    千次阅读 2018-09-13 17:45:29
    1.什么是打包工具,为什么用打包工具? 它是一种将前端代码进行转换,压缩以及合并等操作... web前端打包工具,它能将我们前端人员写得less,sass等编译成css.将多个js文件合并压缩成一个js文件。它的作用就是通过...
  • 用过Maven的人都知道,Maven项目的目录结构跟传统的DynamicWeb项目有些不同。当然我们按照Maven的规范建项目最好,但是当你恰好没有按照Maven的规范来,又恰好需要使用Maven来打包,那该怎么办呢?其实很简单,这些...
  • 对于许多进行WEB开发的朋友来说,在将WEB打包成手机APP时可以选择的工具比较多。今天我主要介绍***apicloud***的使用: appcan是国内比较老牌的平台 apicloud是新起之秀 phonegap是国外的大牌。 长期来看,...
  • NSIS打包工具

    千次阅读 2008-07-07 16:53:00
    NSIS打包工具下载和文档网址: http://nsis.sourceforge.net/Main_Page Abstract:NSIS (Nullsoft Scriptable Install System) is a professional open source system to create Windows installers. It is designed...
  • Java web系统打包成exe安装文件

    千次阅读 2018-06-01 15:54:03
    Java web系统打包成exe安装文件一、 工具准备1、 NSIS打包工具: http://nsis.sourceforge.net下载并安装;2、 NSIS安装脚本的编辑器HM NIS Editor: http://hmne.sourceforge.net下载并安装二、 运行环境准备...
  • web应用打包成为exe

    千次阅读 2019-03-02 22:27:23
    HTML网页/KRPano项目一键打包EXE工具(HTML网页打包成单个windows可执行文件exe) ...web项目打包成exe在windows下一键安装 jdk+Tomcat+mysql https://blog.csdn.net/dj0721/article/details/72462688 jd...
  • web应用打包成桌面可执行程序

    万次阅读 2017-12-09 17:18:04
    开发web项目时,大多数选择主流的chrome等浏览器作为开发调试工具,但最终用户可能要求兼容IE等不常用的浏览器,此时如果重新开发需要耗费很大的人力、物力。针对此种情况,可以考虑把web应用程序打包成一个桌面应用...
  • gulp-前端打包工具

    万次阅读 2020-06-27 20:32:31
    gulp 是基于 node 实现 Web 前端自动化开发的工具,利用它能够极大的提高开发效率。 在 Web 前端开发工作中很多“重复工作”,比如压缩CSS/JS文件。而这些工作都是规律的。找到这些规律,并编写 gulp 配置代码,...
  • vite打包工具的介绍

    千次阅读 2021-04-28 14:21:56
    Vite是Vue的作者尤雨溪开发的Web开发构建工具,它是一个基于浏览器原生ES模块导入的开发服务器,在开发环境下,利用浏览器去解析import,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随启随用。...
  • 增量打包工具:patch-generator-desk

    千次阅读 2018-06-05 19:21:57
    项目增量补丁包神器:全自动web增量打包发版,支持git/svn,支持多模块项目。 - Author:aaron - [项目地址:https://gitee.com/hackempire/patch-generator-desk] - [empire团队地址:...
  • 零配置打包工具 Parcel 实践

    千次阅读 2018-03-06 00:05:15
      继 Webpack 之后,又一款打包工具 Parcel 横空出世,Parcel 是快速、零配置的 Web 应用程序打包器; 1、 Parcel 使用工作进程启用多核编译,并具有文件系统缓存,即使在重新启动后也可快速重新构建。 2 、...
  • node.js之打包工具webpack

    千次阅读 2015-12-27 18:05:34
    node.js中web 开发的打包工具webpack介绍
  • python打包flask web项目

    千次阅读 2020-02-04 12:44:16
    当我们需要将python写的flask web项目打包成exe文件发布时,推荐使用pyinstaller工具。 系统环境:win10 + python3.7.5 一、安装pyinstaller pip install pyinstaller 二、打包项目 1.如果是单文件项目,...
  • 目标:修改web打包后加载页面 小伙伴们应该都知道,h5打包后的包体个加载页面。就是这个。 那么,我们能不能自定义呢?答案是肯定的。 实际上就是html+css所为我们呈现的页面。 首先。 第一步:改名字。 在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,324
精华内容 54,129
关键字:

web打包工具有哪些