由于网络原因,直接使用cabal update不成功,只能自己写脚本直接从网上拖包下来,自己安装。

但是这样做的缺点是需要手动处理dependency,当然,也可以把脚本写的复杂些,自动来处理dependency。

cabal.sh

1 cat<<EOF > .tmp_sed_script
2 s/<\/[^>]*>/&\n/g
3 s/></>\n</g
4 s/a href="\([^"]*\)"/\n[URL: \1 ]\n/g
5 EOF
6
7 home_url="https://hackage.haskell.org"
8
9 item_url=$home_url/"package/"$1
10
11 target_dir=""
12
13 curl $item_url 1> .tmp_page_content 2> /dev/null
14
15 for link in $(sed -f .tmp_sed_script .tmp_page_content | grep URL | awk '{print $2}')
16 do
17 if [[ $link == /*.tar.gz ]]
18 then
19 full_link=$home_url$link
20 echo "wget " $full_link " --no-check-certificate ......"
21 wget $full_link --no-check-certificate
22 archive_file=$(basename $full_link)
23 if [ -f $archive_file ]
24 then
25 tar -xvzf $archive_file 2>&1 > /dev/null
26 fi
27 target_dir=$(tar tzf $archive_file | awk 'NR==1{print}')
28 fi
29 done
30
31 rm .tmp_*
32 rm *.tar.gz*
33
34 cd $target_dir
35 sudo cabal configure
36 sudo cabal install
37 cd ..

  


不过好像必须要处理dependency了,这样才能真正自动化。

ghc-pkg list | sed -e '/[\/(]/d' | awk 'BEGIN{FS="-"}{print $1}' | sed -e '/Cabal/d' | awk 'NF!=0{print}' | sed 's/ //g' > .installed_pkgs

  

if [ ! -f .tmp_sed_script ]
then
cat<<EOF > .tmp_sed_script
s/<\/[^>]*>/&\n/g
s/></>\n</g
s/a href="\([^"]*\)"/\n[URL: \1 ]\n/g
EOF
fi if [ ! -f .tmp_installed_pkgs ]
then
ghc-pkg list | sed -e '/[\/(]/d' | awk 'BEGIN{FS="-"}{print $1}' | sed -e '/Cabal/d' | awk 'NF!=0{print}' | sed 's/ //g' > .tmp_installed_pkgs
fi home_url="https://hackage.haskell.org" item_url=$home_url/"package/"$1 target_dir="" if [ ! -f $.tmp_page_content_"$1" ]
then
curl $item_url 1> .tmp_page_content_"$1" 2> /dev/null
fi sed -f .tmp_sed_script .tmp_page_content_"$1" | grep "URL: /package/" | sed -e "/$1/d" > .tmp_dependency_"$1" # we should make sure that all the package in .tmp_dependency_XXX file should be installed first than this package
#
# for dependency in $(cat .tmp_dependency_"$1")
do
if [[ $dependency == /package/* ]]
then
#echo $dependency
dep=$(echo $dependency | cut -b 10-)
b_installed=false
for installed in $(cat .tmp_installed_pkgs)
do
if [[ $installed == $dep ]]
then
b_installed=true
fi
done
#echo $b_installed " for " $dep if [[ $b_installed == "false" ]]
then
echo "$1 depends on $dep"
echo "$dep" >> .tmp_installed_pkgs
bash cabal_ex.sh $dep
fi
fi
done

  

但是这种以脚本为单位的recursion效率又有点问题,所以最好将其写成一个函数。


home_url="https://hackage.haskell.org"

function prepare()
{
if [ ! -f .tmp_installed_pkgs ]
then
ghc-pkg list | sed -e '/[\/(]/d' | awk 'BEGIN{FS="-"}{print $1}' | sed -e '/Cabal/d' | awk 'NF!=0{print}' | sed 's/ //g' > .tmp_installed_pkgs
fi
} function pull_info_page()
{
# This function will pull info page from web
echo "[CABAL_SCRIPT:]Parsing info page for $1 ......"
item_url=$home_url/"package/"$1 if [ ! -f .tmp_sed_script_"$1" ]
then
cat<<EOF > .tmp_sed_script_"$1"
s/<\/[^>]*>/&\n/g
s/></>\n</g
s/a href="\([^"]*\)"/\n[URL: \1 ]\n/g
EOF
fi if [ ! -f .tmp_page_content_"$1" ]
then
curl $item_url 1> .tmp_page_content_"$1" 2> /dev/null
fi if [ ! -f .tmp_dependency_"$1" ]
then
sed -f .tmp_sed_script_"$1" .tmp_page_content_"$1" | grep "URL: /package/" | sed -e "/$1/d" > .tmp_dependency_"$1"
fi
} function calc_dependency()
{
# This function just calculate the dependency packages of $1
# and append it to the global list
echo "[CABAL_SCRIPT:]Resolving dependencies for $1 ......"
pull_info_page $1 for dependency in $(cat .tmp_dependency_"$1")
do
if [[ $dependency == /package/* ]]
then
#echo $dependency
dep=$(echo $dependency | cut -b 10-)
b_installed=false
for installed in $(cat .tmp_installed_pkgs)
do
if [[ $installed == $dep ]]
then
b_installed=true
fi
done
#echo $b_installed " for " $dep if [[ $b_installed == "false" ]]
then
echo "$1 depends on $dep"
echo "$dep" >> .tmp_installed_pkgs
#bash cabal_ex.sh $dep
install_package $dep
fi
fi
done
} function install_package()
{
# This function just download and install a package $1
# it doesn't care about dependency
target_dir="" calc_dependency $1 # Download package
for link in $(sed -f .tmp_sed_script_"$1" .tmp_page_content_"$1" | grep URL | awk '{print $2}')
do
if [[ $link == /*.tar.gz ]]
then
full_link=$home_url$link
archive_file=$(basename $full_link)
#target_dir=$(tar tzf $archive_file | awk 'NR==1{print}')
target_dir=$(echo $archive_file | sed -re 's/(.*)\.tar\.gz$/\1/g')
#echo "target_dir is $target_dir" if [ ! -d $target_dir ]
then
if [ ! -f $archive_file ]
then
#echo "wget " $full_link " --no-check-certificate ......"
echo "[CABAL_SCRIPT:]Downloading $full_link ......"
wget $full_link --no-check-certificate
fi if [ -f $archive_file ]
then
echo "[CABAL_SCRIPT:]Extracting $archive_file ......"
tar -xvzf $archive_file 2> /dev/null 1> /dev/null
fi
fi
fi
done # rm .tmp_*
# rm *.tar.gz* # Install package
cd $target_dir
echo "[CABAL_SCRIPT:]Installing $1 ......"
sudo cabal configure
sudo cabal install
cd ..
} prepare
install_package $1
rm .tmp_*

  

但是仍然有问题,这里没有对dependency的版本做判定,因此仍然失败。

cabal替代脚本的更多相关文章

  1. SQL SERVER 2008向ORACLE 11G迁移示例

    来源于:http://www.cnblogs.com/hiizsk/ 由SQL SERVER 2008向ORACLE 11G迁移过程记录之一-表 使用Oracle Sql Developer将SQL ...

  2. 通过DOS、SHELL批处理命令加载Lib并编译和打包Java项目(或者运行项目)

    有些时候,需要通过DOS批处理来编译整个项目的JAVA文件:并且编译后还要对Class文件进行打包成jar文件...这还不是最烦的,最烦的是,编译和打包的时候需要依赖其他多个jar文件,困难就这么来了 ...

  3. JS实现上下左右四方向无间隙滚动

    想必大家都注意到<marquee>的不循环滚动,所以出现了很多替代脚本,或iframe或JS输出< marquee>,不管怎么做,都略显麻烦.下面说一下这个相对简单的实现思路: ...

  4. js图片无缝滚动代码

    想必大家都注意到<marquee>的不循环滚动,所以出现了很多替代脚本,或iframe或JS输出<marquee>,不管怎么做,都略显麻烦.下面说一下这个相对简单的实现思路:一 ...

  5. jsp内置对象和el表达式

    九个内置对象 *out jsp的输出流,用来向客户端响应 *page 当前jsp页面, 它的引用数据类型是Object,即真身中有如下代码 Object page=this; *config 它对应真 ...

  6. WebLogic域配置策略

    WebLogic域配置策略--手动和模板选项,第一部分 域含有BEA WebLogic Server实例的配置信息.它包含有关服务器.集群和机器的配置信息.域还含有关于资源,例如Java数据库连接(J ...

  7. java新知识系列 三

    1:trycatch中需要注意的地方. 2:ServletConfig以及ServletContext对象. 3: Spring事务属性的种类:   传播行为.隔离级别.只读和事务超时. 5:关于程序 ...

  8. go第三方日志系统-seelog-Basic sections

    https://github.com/cihub/seelog 文档学习:https://github.com/cihub/seelog/wiki 1.安装: go get github.com/ci ...

  9. SharePoint Framework 企业向导(二)

    博客地址:http://blog.csdn.net/FoxDave 开发者视角 SharePoint开发者,无论是新手还是有经验的,都可以从SPFx中获取一些东西.当前SPFx的发布版本专注于以一 ...

随机推荐

  1. 一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍!

    作者:风过无痕-唐 http://www.cnblogs.com/tangyanbo/p/4462734.html 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: create  ...

  2. form表单,登录用户,密码,按钮,提交、重置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. JVM(8)之 Stop The World

    开发十年,就只剩下这套架构体系了! >>>   小伙伴还记得上一篇中我们留下的一个问题吗?什么是停顿类型!经过前几章的学习,我们知道垃圾回收首先是要经过标记的.对象被标记后就会根据不 ...

  4. vue 项目,获取手机验证码和图形验证码(iviewUI框架)

    1.编辑获取验证码模块 <Form ref="phoneFormItem" :model="phoneFormItem" :label-width=&qu ...

  5. psfaddtable - 添加一个Unicode字符表到控制台字体中

    总览 psfaddtable 字体文件 表文件 [输出文件] 描述 Psfaddtable 命令融合了 字体文件 提供的 .psf 格式的控制台字体和 表文件 提供的Unicode字符表, 生成一个带 ...

  6. centos 7 命令界面与GUI界面切换

    一.需要重启生效 1. 命令模式     systemctl set-default multi-user.target 2. 图形模式     systemctl set-default graph ...

  7. 关于Jenkins的网站及其他学习的网站

    配置efk https://www.cnblogs.com/fzxiaomange/p/efk-getstart.html https://blog.csdn.net/wangmuming/artic ...

  8. Sass-插值#{}

    使用 CSS 预处理器语言的一个主要原因是想使用 Sass 获得一个更好的结构体系.比如说你想写更干净的.高效的和面向对象的 CSS.Sass 中的插值(Interpolation)就是重要的一部分. ...

  9. java 反转数组

    package java03; public class Demo05ArrayReversr { public static void main(String[] args) { int[] arr ...

  10. Flutter的flutter_calendar日曆的使用

    效果: 添加依賴: flutter_calendar: ^0.0.1 項目中導入 import 'package:flutter_calendar/flutter_calendar.dart'; 例子 ...