从Logecho开始您的静态博客

为什么要静态化

相比于各类社交网站的兴起,个人博客这个平台也开始进入更深刻的自我转变过程。由于我个人一直在参与这个过程,所以更能感受到它所带来的影响。

以 Wordpress 为首的系统将越来越趋于 CMS 化,并且不可避免地越来越臃肿。以 Ghost 为首的新平台,却把重心转向了撰写体验地打造上。

在这个过程中出现了一个异类,那就是静态博客系统。网页静态化似乎与现今越来越丰富地媒体展现背道而驰,但它的出现却把自由撰稿者从繁杂的不必要的系统维护中解放出来,让大家更专注于内容本身的精雕细琢,至于内容的分享与传播则可以交给更多的社交平台。

Logecho是什么

是的,你现在看到我的网站就是由 Logecho 生成的全静态网站,它可以运行于任何支持静态网站的服务器上(基本上是所有的)或者类似 github.io 之类提供静态托管的平台中。不需要任何服务器配置,写完了就可以直接发布。

这是我继 Typecho 之后开发的又一款博客软件,目前还处于测试阶段,如果你迫不及待想要去使用它,请看下面的文字。

如何开始

需要注意的是 Logecho 的本地运行环境需要 PHP 5.4+ 的支持,如果你运行的是最新的 Mac OSX 系统那么就不用关注这些。另外我们的命令行模式对 Windows 还不支持,这一点请注意。

因为目前还在测试中,所以你得先从 github 上克隆代码

git clone https://github.com/typecho/logecho.git

然后编译出一个可执行文件

cd logecho && php build.php

你现在可以在当前目录下看到 logecho 这样一个可执行文件,运行它可以看到一些基本用法

$ ./logecho
LOGECHO 1.0.0
Copyright (c) 2013-2014 Logecho (http://logecho.com)
usage: logecho (init|build|sync|serve|help|update|import) [your-working-directory]

实际上这个文件就是所有 logecho 的全部了,你可以把它拷贝到任意你想要的位置,或者将其加入到环境变量中,这样你可以直接在任何地方使用logecho这样一个命令。

初始化一个目录

mkdir blog
logecho init blog

这样 blog 目录就初始化完成了,它的结构是

blog/
├── _theme
│   ├── archives.twig
│   ├── footer.twig
│   ├── header.twig
│   ├── index.twig
│   ├── post.twig
│   └── style.css
├── config.yaml
└── posts
    └── hello-world.md

可以从字面意思直观理解到

配置文件

# You can configure this file to customize your site
globals:
    # Definition of global variable
    title : My Blog Site
    description : Yet another logecho site
    url : http://logecho.com/
blocks:
    # All blocks to compile
    post:
        source  : /posts/
        target  : /posts/
    category:
        source  :
            default : Default
        template  : archives.twig
        target    : archives.html
    tag:
        template  : archives.twig
        target    : archives.html
    archive:
        template  : archives.twig
        target    : archives.html   
    index:
        template  : index.twig
        target    : index.html
        limit     : 10
feeds:
    # Definition of feeds gererating
    source  : post
    recent  : 20
    target  : feeds.xml
    author  : Logecho
build:
    # The commands running after compile
    - cp -f @THEME/style.css @TARGET/style.css
sync:
    # The commands running with sync operation

这是一个配置文件的样本,从上到下

globals

这里可以设定所有的全局变量,需要特别注意的是,在Logecho里没有任何预设的全局变量,你在这里设定的值只是为了方便你从模版里面调用对应的变量。

blocks

这里用来设定所有的内容源以及编译关系,它主要有四种类型,用来描述内容和归档之间的关系。内容就是诸如文章,页面之类的载体,归档就是诸如分类,标签之类的集合。我们通过对 block 不同的定义来实现这两者之间的组合

编译目标target

每个 block 都会设定一个 target,也就是生成的文件目标,它可以是一个文件也可以是一个目录,如果是一个目录 logecho 将自动按每个条目生成单个文件,如果是一个文件 logecho 将把所有条目生成到一个文件中。

注意:Logecho 会按照字符串结尾处有没有/来判断是否为一个目录。如果你不设定 target,logecho 将自动把 block 编译为一个以它的类型为文件名的 html 文件,比如 tag 将编译为 tag.html。

关联内容和归档

在某篇内容中,比如hello-world.md文件的最前方加上如下语法即可将这个内容与相应的归档关联起来

@category:default
@tag:php,redis

....

以上语法将这篇内容关联到名为defaultcategory下面,以及名为phpredistag下面.其中category必须关联你在 source 中指定的名称,而tag因为没有指定source,则可以关联任意名称。

模版文件

Logecho 采用了Twig模版系统

每个 block 都必须指定一个模版文件,主页的模版文件将自动识别为index.twig。如果你不指定相应 block 的模版文件,logecho 将自动指定一个以它的类型为文件名的 twig 文件作为模版,比如 tag 的模版将识别为 tag.twig。

在模版中你可以使用如下变量

对于当前 block 生成的变量遵循如下原则

变量名就是block名称

比如在 post 对应的 post.twig 里,你可以直接使用{{ post.title }}语法来调用 post 变量的相关属性。

在归档页按target的类型来读取

在前面对 config 的解释中,target 可以设置为目录,也可以设置为单个文件,当它为目录的时候,当前 block 的变量取出的是一个标准的 hash 结构

比如在category.twig中,你可以直接使用{{ category.name }}来调用category的属性。

但如果它是一个目录,那么 block 的变量取出的就是一个数组,你需要用循环的语法取出每个元素

比如在category.twig中,你需要

{% for cat in category %}
{{ cat.name }}
{% endfor %}

其他命令

build

logecho build /your-blog-dir/

它将根据你的配置,生成所有的 target 文件

serve

logecho serve /your-blog-dir/

它将先生成所有 target 文件,然后启动一个 mini 的 http 服务器,以方便你直接预览你的网页。你可以直接访问http://localhost:7000/来浏览

sync

logecho sync /your-blog-dir/

将在执行完 build 之后,再执行你再config.yaml里设定的sync命令

import

logecho import http://your-blog-domain /your-blog-dir/

导入任何支持 xmlrpc 接口的博客到本地,它还将在你的博客目录下生成一个名为wxr.xml的xml文件,这里面包括了你所有文章的评论,你可以直接将其导入到类似disqus的第三方评论平台中。

update

logecho update

自动更新程序(未完成)

已有 48 条评论

  1. 冰剑 冰剑

    typecho你打算抛弃它了吗?另寻新欢?

    1. joyqi joyqi

      Typecho不会抛弃啊

      1. perichr perichr

        TE这么帅,不准抛弃啊~

  2. zuobq zuobq

    typecho不更新了?那就期待

    Logecho的windows版

  3. Devil Devil

    你舍得抛弃typecho吗...

  4. 驰子 驰子

    typecho呢?

  5. Vanish Vanish

    太高端大气上档次了!玩不转~~

  6. crll crll

    太高端大气上档次了!typecho怎么转换过去~~

  7. crll crll

    另外或许可以增加一项about页面么。

  8. crll crll

    。。。小白不会安装。。

    1. joyqi joyqi

      上面是什么玩意,你装了composer?

      1. crll crll

        是下载了一份composer....

        1. joyqi joyqi

          你把composer下载到logecho目录里了吗

          1. crll crll

            是的,我删除了,我以为是需要一份。原来是修改php.ini

            [Phar]
            ; http://php.net/phar.readonly
            phar.readonly = Off

            但是我遇到了新的问题。

            mkdir blog 之前运行过了。
            logecho init blog 提示:logecho: command not found

          2. crll crll

            如果运行 ./logecho init blog

            会显示:

            Run init

            mkdir -p blog/_theme

            PHP Notice: Undefined variable: return in phar:///home/wwwroot/logecho/lib/Command.php on line 59

            PHP Warning: passthru() has been disabled for security reasons in phar:///home/wwwroot/logecho/lib/Command.php on line 59

            PHP Notice: Undefined variable: return in phar:///home/wwwroot/logecho/lib/Command.php on line 62

            mkdir -p blog/posts

            PHP Notice: Undefined variable: return in phar:///home/wwwroot/logecho/lib/Command.php on line 59

            PHP Warning: passthru() has been disabled for security reasons in phar:///home/wwwroot/logecho/lib/Command.php on line 59

            PHP Notice: Undefined variable: return in phar:///home/wwwroot/logecho/lib/Command.php on line 62

            Copy files ...

            PHP Warning: copy(blog/posts/hello-world.md): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 105

            PHP Warning: copy(blog/_theme/archives.twig): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 106

            PHP Warning: copy(blog/_theme/footer.twig): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 107

            PHP Warning: copy(blog/_theme/header.twig): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 108

            PHP Warning: copy(blog/_theme/index.twig): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 109

            PHP Warning: copy(blog/_theme/post.twig): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 110

            PHP Warning: copy(blog/_theme/style.css): failed to open stream: No such file or directory in phar:///home/wwwroot/logecho/main.php on line 111

            Finished init blog

            以上的信息并不是在logecho 目录运行的,在logecho运行的信息如下:

            root@115.29.100.72:/home/logecho# ./logecho init blog
            Run init
            mkdir -p blog/_theme
            PHP Notice: Undefined variable: return in phar:///home/logecho/logecho/lib/Comm and.php on line 59
            PHP Warning: passthru() has been disabled for security reasons in phar:///home/ logecho/logecho/lib/Command.php on line 59
            PHP Notice: Undefined variable: return in phar:///home/logecho/logecho/lib/Comm and.php on line 62
            mkdir -p blog/posts
            PHP Notice: Undefined variable: return in phar:///home/logecho/logecho/lib/Comm and.php on line 59
            PHP Warning: passthru() has been disabled for security reasons in phar:///home/ logecho/logecho/lib/Command.php on line 59
            PHP Notice: Undefined variable: return in phar:///home/logecho/logecho/lib/Comm and.php on line 62
            Copy files ...
            PHP Warning: copy(blog/posts/hello-world.md): failed to open stream: No such fi le or directory in phar:///home/logecho/logecho/main.php on line 105
            PHP Warning: copy(blog/_theme/archives.twig): failed to open stream: No such fi le or directory in phar:///home/logecho/logecho/main.php on line 106
            PHP Warning: copy(blog/_theme/footer.twig): failed to open stream: No such file or directory in phar:///home/logecho/logecho/main.php on line 107
            PHP Warning: copy(blog/_theme/header.twig): failed to open stream: No such file or directory in phar:///home/logecho/logecho/main.php on line 108
            PHP Warning: copy(blog/_theme/index.twig): failed to open stream: No such file or directory in phar:///home/logecho/logecho/main.php on line 109
            PHP Warning: copy(blog/_theme/post.twig): failed to open stream: No such file o r directory in phar:///home/logecho/logecho/main.php on line 110
            PHP Warning: copy(blog/_theme/style.css): failed to open stream: No such file o r directory in phar:///home/logecho/logecho/main.php on line 111
            Finished init blog

          3. joyqi joyqi

            你需要./logecho init blog

  9. perichr perichr

    求支持windows!!我现在fork了一个分支,然后手动改支持win……主要是php前缀以及命令行下路径反斜杠的问题。还没想到比较优雅的平台判断支持方法……

    1. joyqi joyqi

      我想在php上编译一个可执行文件出来,不过还没想到解决方法

      1. perichr perichr

        实在不行可以考虑用bat转接一下……

  10. vpsmm vpsmm

    这个可以有,真的蛮不错的。当然,我会继续使用TYPECHO。

  11. Ryu.Zheng Ryu.Zheng

    支持一个,但是静态博客每次generate生成还是有点麻烦,能直接在云端写,直接generate然后deploy吗

    1. joyqi joyqi

      这个确实挺酷的,但我不确定有多少人需要这一功能,很多人习惯用离线客户端

      1. Ryu.Zheng Ryu.Zheng

        之前用Hexo时,有试过在Koding上搭建的人,这样手机上或者去了别的地方,不是自己的电脑还是可以写,

        如何在 Koding 雲端開發平台上建置 Hexo 環境(http://kywk.github.io/moco/pro...

        珠联璧合:利用 Koding 为静态博客搭建在线编辑环境 | HaHack(http://www.hahack.com/tools/ko...

        不知道你怎么解决这个问题,能写一个客户端出来吗,不是反对的意思,而是十分关心这个问题,因为这个问题我放弃Hexo了。静态虽然很酷,如果能解决这个问题会更上一层楼了。

        不管怎样,支持博主!

        另外,能否转载这篇日志,也算支持宣传一下

        1. joyqi joyqi

          ...你给的这两个链接貌似都是404

          1. Ryu.Zheng Ryu.Zheng

            不好意思啊,第一次用Disqus,写多了MD,都给链接加括号,所以多了个括号
            如何在 Koding 雲端開發平台上建置 Hexo 環境
            http://kywk.github.io/moco/pro...

            珠联璧合:利用 Koding 为静态博客搭建在线编辑环境 | HaHack
            http://www.hahack.com/tools/ko...

            祝好

  12. Moon Moon

    您好!

    php build.php这一步好像有一些问题

    它修改phar.readonly为Off

    如果php.ini文件不止一个的话,它判断的并不是当前apache正在使用的那个php.ini

    1. joyqi joyqi

      首先肯定要修改phar.readonly=Off,至于修改哪个php.ini,可以在命令行下输入 php -i | grep php.ini 来判断哪个是loaded的配置文件

      1. Moon Moon

        原来是我搞错了,3q

  13. Ink Say Ink Say

    Looks very impressive. I would like to have a try if it is really simple and powerful.

  14. ytf4425 ytf4425

    Octopress路过,现在有关Octopress的文档还是蛮多的,等哪天能做出个移植工具我也试试logecho

  15. Guest Guest

    感觉style.css文件的引用有点问题。运行完logecho build /your-blog-dir/之后在/_target/index.html中引用的地址是../style.css。但是config.yaml里面默认是把模板里面的style.css文件复制到了@TARGET里面。本来应该引用_target文件夹里面的,结果生成的index.html引用到_target文件夹外面了,是不是啊?

    1. joyqi joyqi

      这是默认例子的一个问题,实际上应该直接写/style.css就可以了

      1. Guest Guest

        近期还有继续更新完善logecho的计划吗?想拿它当主力平台但是感觉还不太完善。

  16. typecho.ga typecho.ga

    运行import命令的时候报错:PHP Fatal error: Call to undefined function LEcurl_init() in phar:///var/www/logecho/logecho/lib/Import.php on line 225。好像是路径错了,里面的logecho重复了一次。

    1. joyqi joyqi

      应该是你的php没有装curl扩展,你可以用命令 “php -i | grep curl” 检查下

      1. typecho.ga typecho.ga

        没有返回任何东西呀。好奇怪。

        1. joyqi joyqi

          那就证明没有装curl,正常的应该返回curl的版本号,这个php5以后curl应该是默认就安装了的。如果你在ubuntu下可以用sudo apt-get install php5-curl来安装,然后在php.ini里加上extension=curl.so

          1. typecho.ga typecho.ga

            照做之后好像错得更离谱了。。

          2. joyqi joyqi

            把extension=curl.so去掉

          3. typecho.ga typecho.ga

            下面那段报错我弄好了。直接重新编译了一遍build.php,估计是logecho.phar什么时候被我不小心resave了一下。

  17. typecho.ga typecho.ga

    这个出错是typecho的问题还是logecho的问题呀?

    1. joyqi joyqi

      你有使用什么typecho插件么?

      1. typecho.ga typecho.ga

        所有插件我都禁用了,还是这样报错。会不会是文字编码的问题?我用word离线发布功能,设置地址为http:/typecho.ga/index.php/act...

  18. zyzyw zyzyw

    这感觉不是写字啊,是在写代码

  19. Trusty Wolf Trusty Wolf

    [root@sg logecho]# ./logecho init blog
    [debug] main.run
    [debug] main.read_opt
    [debug] main.init: blog
    [error] Objects returned by RecursiveIterator::getChildren() must implement RecursiveIterator

    请问这是为什么呢? 环境是CentOS7

    1. joyqi joyqi

      这貌似是个php的bug,你的php版本是多少

      1. Linczh Linczh

        同样是这个问题,5.4 5.5都试了一下....改版本木有解决

  20. hooka hooka

    先把typecho搞好再说,看到啥就跟风搞啥,最后啥都搞不好。

添加新评论