前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NET跨平台:在Ubuntu下搭建ASP.NET 5开发环境

NET跨平台:在Ubuntu下搭建ASP.NET 5开发环境

作者头像
逸鹏
发布2018-04-09 15:52:58
2.2K0
发布2018-04-09 15:52:58
举报
文章被收录于专栏:逸鹏说道

0x00 写在前面的废话

年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了。最近工作上有个小功能要做成Web应用,之前曾经有过类似需求,当时用的是WCF做WebAPI,前端用ExtJS。这次需求不关键,只要能解决问题就好,具体用什么技术无所谓,正好赶上ASP.NET 5发布,所以打算尝试一下。在Windows下借助强大的VS一路安装就解决问题了,不过ASP.NET5跨平台啊,决定试一下在Linux下部署开发环境,以后再忽悠别人入坑也更有说服力。之前一直用Windows,只是出于好奇装过Linux,所以对Linux不是很熟系,边查边做,期间自然是各种坑,折腾了一天多,不过最后也算跑起来了,在这里记录一下踩到的坑和解决的以及未解决的问题。

0x01 Windows和Ubuntu双系统

之前都使用虚拟机装Linux的,这次既然要测试就认真一点吧,从硬盘中划出了100G的空间,参照网上的教程装了Ubuntu双系统。不过这个不是本文的重点,而且很容易就能搜到大量教程,具体就不说了。我参考的这篇文章: http://www.linuxidc.com/Linux/2012-05/59663.htm

0x02 安装ASP.NET 5开发环境

下面重点开始了,主要步骤参照的微软的官方文档: https://docs.asp.net/en/latest/getting-started/installing-on-linux.html 首先说明一下踩到的第一个坑,因为很多命令都需要用到sudo,所以我干脆sudo bash把终端切换到了root,造成的后果就是后面建立的有些文件夹都是root的,导致后来在非root下用yo创建项目的时候出现权限错误,花了很多时间才找到问题。所以为了少出现不必要的麻烦下面操作时建议大家还是老老实实用sudo。下面截图中可以看到我还是用的root,大家不要这样。

1 安装DNVM

首先准备开发环境搭建用到的工具。一般来说很可能系统自带了,不过以防万一还是运行一下,反正也很快:

代码语言:javascript
复制
sudo apt-get install unzip curl

这个命令会安装unzip和curl两个工具,用于解压和下载 什么是DNVM、DNX可以参照@张善友 的这篇文章http://www.cnblogs.com/shanyou/p/4589930.html 写的很全面 然后下载DNVM。官网文档给出了以下命令:

代码语言:javascript
复制
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

这里就用到刚刚准备好的curl了,不过一般系统都自带了。

按照系统提示在下载完后执行命令

代码语言:javascript
复制
source ~/.dnx/dnvm/dnvm.sh

这样DNVM就安装完成了。可以输入dnvm看是否安装成功。

2 使用DNVM安装DNX

首先还是需要准备安装中用到的工具

代码语言:javascript
复制
sudo apt-get install libunwind8 gettext libssl-dev libcurl4-openssl-dev zlib1g libicu-dev uuid-dev

然后用DNVM安装DNX for.NET Core

代码语言:javascript
复制
dnvm upgrade -r coreclr

然后使用DNVM安装DNX for Mono

代码语言:javascript
复制
dnvm upgrade -r mono

安装时提示我的系统里没有Mono,需要安装。参照官网文档给出的链接,依次执行以下命令:

代码语言:javascript
复制
apt-key adv --keyserver keyserver.ubuntu.com –recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EFecho "deb http://download.mono-project.com/repo/debian wheezy main" |  tee /etc/apt/sources.list.d/mono-xamarin.list
apt-get update
apt-get install Mono-Complete 

3 安装libuv

为什么要安装这个东西呢,因为开发中需要运行本地Web服务测试啊,在Windows中我们有IIS Express,可是Linux中没有。官方推荐使用的是kestrel,而kestrel用到了libuv这个库,所以我们需要安装这个库。这个库是用源码编译的方式安装的,命令比较多,反正我是一行一行复制着完成的,基本上复制完下一条命令的时间上一条命令就执行完成了,体验也算不错:)大致的过程就是:安装编译需要的工具,下载并解压源代码,编译安装,加载共享库使新库生效。

代码语言:javascript
复制
sudo apt-get install make automake libtool curl
curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/srccd /usr/local/src/libuv-1.4.2sudo sh autogen.shsudo ./configuresudo makesudo make installsudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/sudo ldconfig

至此我们已经完成ASP.NET 5 开发环境的安装了。这样是不是就结束了呢?刚开始我也是这么想的,不过马上就意识到不对了。当我想建个测试工程的时候发现无法入手,在Windows上我都是用VS新建解决方案,选择Web,然后选择用什么样的模板,可是在Linux下没有模板啊,总不能手动一个一个文件建立吧。然后继续看文档找到原来还有Your First APS.NET 5 Application on XXX系列,不过里面没有Linux,参照Mac应该也没问题。 https://docs.asp.net/en/latest/tutorials/your-first-mac-aspnet.html

0x03 安装和配置开发工具

开发工具自然是Visula Studio Code,官网下载 https://code.visualstudio.com/ 下载后解压,直接运行Code即可使用。 建立项目时的模板是通过yeoman生成的。安装yeoman需要用npm,于是我们先安装npm

代码语言:javascript
复制
sudo apt-get install npm

npm和nodejs是相互依赖的,安装其中任意一个都会自动安装上另外一个。安装后可以使用

代码语言:javascript
复制
npm install -g yo bower grunt-cli gulp

来安装yeoman、bower、grunt-cli、gulp。不过问题来了,yeoman需要nodejs版本在0.12以上,而用apt-get安装的版本只是0.10,各种折腾都升级不了,包括使用传说中的n这个名字怪异但据说是专用于升级nodejs的工具都不行。在网上查来查去找到了这边文章: http://my.oschina.net/tbaby/blog/412052 里面有这么一条命令:

代码语言:javascript
复制
curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -

打开 https://deb.nodesource.com看了下我擦原来在这里

运行上面那条命令下载完成后还会提示

执行这条命令

代码语言:javascript
复制
sudo apt-get install nodejs

就可以安装最新版本的nodejs了。安装完成后已经成了最新的0.12.9

这样再使用npm安装yeoman等一系列工具就没有问题了,命令如下:

代码语言:javascript
复制
npm install -g yo bower grunt-cli gulp

yeoman是装好了,不过yeoman还不能生成针对ASP.NET的模板,这个也是需要我们安装的。使用以下命令来安装ASP.NET模板:

代码语言:javascript
复制
npm install -g generator-aspnet

安装完成后我们就可以使用yeoman建立工程了。进入我们想放置工程的目录,运行

代码语言:javascript
复制
yo aspnet

然后我们就看到了模板选择界面,我们选择WebApplication,然后会提示我们输入应用的名称,我们输入first,然后yeoman会帮我们创建first这个目录,然后把项目文件都建立好。

使用VSCode打开first目录会提示缺少依赖

在工程所在目录下执行下面命令

代码语言:javascript
复制
dnu restore

这样就可以解决依赖的问题。如果是第一次restore要下载很多东西可能会花点时间。 完成之后目录结构大概就是这样,跟用VS创建的一致。代码也会有属性和方法的引用提示。

在工程的project.json文件中我们可以看到commands中友web这个命令,在dependency中我们也能找到相应的依赖。使用web这个命令就能开启kestrel服务。

在工程所在目录下执行

代码语言:javascript
复制
dnx web

可以开启web服务,这样在浏览器中输入localhost:5000就能看到我们的页面了。

尝试把HomeController中About的消息改一下。必须要重启Web服务才能生效,这点不如用VS啊,VS可以直接改了保存然后F5刷新就能看效果,跟用脚本开发一样。

比较奇怪的是把dnx切换到coreclr后输入dnx没有任何反映,网上查也没看到问题出在哪里。有知道的请赐教。

0x04 写在最后的废话

由于对Linux不是很熟悉,整个过程遇到了很多大大小小的问题,我挑了几个比较恼人的写了下。还有些弱智到会暴露智商的我都没提,这样才够心机。不过完成后对dnvm、dnx等很多概念有了更多的认识。但让我做ASP.NET 5开发的话我还是会选择windows啊,毕竟亲生的还有强大的VS。最后再说一下Ubuntu的使用,之前一直使用Windows,突然换到了Ubuntu感觉没有想象中的那么困难,图形界面也算比较成熟了,很多工具用Web应用基本可以解决。开发的话JetBrains系列都可以使用,加上现在还多了VSCode,只要不写WPF感觉问题都不是很大。遇到问题了网上搜一下基本也都能解决,慢慢就应该能熟练了吧。

评论

#1楼 2015-12-25 20:50 | weixiao520

受益良多。

支持(0)反对(0)

#2楼[楼主] 2015-12-25 20:53 | durow

@weixiao520 我也是瞎折腾,以后再跟别人说asp.net跨平台的时候就更有底气了:)

支持(0)反对(0)

#3楼 2015-12-26 10:00 | dudu

运行命令 export DNX_TRACE=1 后,可以看到基于coreclr运行dnx web的错误信息

支持(0)反对(0)

#4楼[楼主] 2015-12-26 11:11 | durow

@dudu 多谢dudu大大,回去了试一下,说实话我个人更倾向用coreclr。

支持(0)反对(0)

#5楼 2015-12-26 13:18 | dudu

@durow 我都是Linux上不装mono,直接dnvm upgrade -r coreclr

支持(1)反对(0)

#6楼[楼主] 2015-12-26 13:29 | durow

@dudu 我刚开始也是这么打算的,出现问题半天没找到原因。后来试了下mono能跑说明问题就是出在coreclr上了,肯定我哪里没搞好。

支持(1)反对(0)

#7楼 2015-12-26 13:38 | dudu

@durow 试试 sudo ln -s /usr/local/lib/libuv.so /usr/lib/libuv.so.1

支持(0)反对(0)

#8楼[楼主] 2015-12-26 14:01 | durow

@dudu 之前查这个问题时看到有说可能这个原因的,去那个目录下看过,有那个连接。而且mono能跑起来说明kestrel应该没问题。网上也找到有别人问过类似问题,有回答说是coreclr的问题,还不够完善,不过那个回答很早了,我这个问题应该不是那个原因。我在想是不是漏掉了什么东西,之前装了dnx for mono的时候提示我没有Mono,让我记得装。装了coreclr后没注意到有没有提示,是不是还需要其他东西。

支持(0)反对(0)

#9楼 2015-12-26 15:22 | zwmyxzs

unbuntu15?

支持(0)反对(0)

#10楼 2015-12-26 15:35 | Amonk

66666666666666

支持(0)反对(0)

#11楼 2015-12-26 15:35 | Amonk

这才是我想要的

支持(0)反对(0)

#12楼[楼主] 2015-12-26 15:42 | durow

@zwmyxzs 我擦厉害,是15,这个怎么看出来的啊

支持(0)反对(0)

#13楼 2015-12-26 16:03 | zwmyxzs

@durow coreclr只在14下发布通过,有个组件叫libicu,14是libicu52,15这个东西比较高是libicu55,你试试下个libicu52可能就好了。 wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu52_52.1-8ubuntu0.2_amd64.deb dpkg -i libicu52_52.1-8ubuntu0.2_amd64.deb

支持(0)反对(0)

#14楼[楼主] 2015-12-26 16:25 | durow

@zwmyxzs 太感谢了,人在外面,回去了试试。园子里果然牛人多。

支持(0)反对(0)

#15楼[楼主] 2015-12-26 16:30 | durow

@zwmyxzs 看到你那篇文章了,我擦我搜了好久也没找到你那篇。 看来用Ubuntu还是要选择长期维护版啊,支持的比较好。

支持(0)反对(0)

#16楼 2015-12-26 20:40 | xiaohuazi

curl -O http://img.my.csdn.net/uploads/201211/29/1354170699_6619.png |http://ubmcmm.baidustatic.com/media/v1/0f000rjWcxSC61lrQ9tTZ6.jpg 这个用法是错的!

支持(0)反对(0)

NPOI 读取excel到DataTable 读取隐藏列 读取公式列

处理思路:

1.打开excel 用NPOI进行读取;

2.读取第一个Sheet;

读取过程中:

a.先设置相应列 不隐藏

b.读取Cell时 先判断是否的包含公式

相应代码如下:

代码语言:javascript
复制
public static DataTable ReadDataFromExcelByNPOI()
{
    DataTable dt = new DataTable();        
    var filePathAndName = Path.Combine(Server.MapPath("~/Content/Excel"), "ExcelForUploadTest.xls");     //打开文件读取数据
    stream = System.IO.File.Open(filePathAndName2, FileMode.Open);    

    //通过Stream创建Workbook
    HSSFWorkbook workbook = new HSSFWorkbook(stream);    //获取excel的第一个sheet
    HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0);    
    //设置隐藏列 为 不隐藏
    for (int iHide = 0; iHide <= 40; iHide++) {
        sheet.SetColumnHidden(iHide, false);
    }    

    //最后一列的标号(即总的行数)
    int rowCount = sheet.LastRowNum;    //获取sheet的首行
    HSSFRow headerRow = (HSSFRow)sheet.GetRow(0);    //一行最后一个方格的编号(即总的列数)
    int cellCount = headerRow.LastCellNum;    string columnNames = @"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
                    AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ";    string[] columns = columnNames.Split(',');    //使用 A B C D ... 字母的方式 命名DataTable的各列名
    for (int i = headerRow.FirstCellNum; i < cellCount; i++)
    {        
        //DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
        DataColumn column = new DataColumn(columns[i]);
        dt.Columns.Add(column);
    }    for (int i = (iHeaderRowIndex.Value + 1); i <= rowCount; i++)
    {                        
        HSSFRow row = (HSSFRow)sheet.GetRow(i);
        DataRow dataRow = dt.NewRow();        if (row != null)
        {            for (int j = row.FirstCellNum; j < cellCount; j++)
            {                if (row.GetCell(j) != null)
                {                    //如果是公式Cell 
                    //则仅读取其Cell单元格的显示值 而不是读取公式
                    if (row.GetCell(j).CellType == CellType.FORMULA)
                    {
                        dataRow[j] = row.GetCell(j).StringCellValue;
                    }else{
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
            }
        }        //某标示列 33        //某标示列 38        //其值非空 标示是有效数据        //其值为空 标示结束
        if(string.IsNullOrEmpty(dataRow[33].ToString())            && string.IsNullOrEmpty(dataRow[38].ToString())
            )
        {            break;//读取结束 退出For循环        }        else
        {
            dt.Rows.Add(dataRow);
        }
        
        
    }


    workbook = null;
    sheet = null;    return dt;
}#endregion
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 写在前面的废话
  • 0x01 Windows和Ubuntu双系统
  • 0x02 安装ASP.NET 5开发环境
    • 1 安装DNVM
      • 2 使用DNVM安装DNX
        • 3 安装libuv
        • 0x03 安装和配置开发工具
        • 0x04 写在最后的废话
        • NPOI 读取excel到DataTable 读取隐藏列 读取公式列
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档