<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>drush | 伪架构师</title>
    <link>/tags/drush/</link>
      <atom:link href="/tags/drush/index.xml" rel="self" type="application/rss+xml" />
    <description>drush</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 05 Aug 2015 10:32:19 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>drush</title>
      <link>/tags/drush/</link>
    </image>
    
    <item>
      <title>Drush提示用户输入的三种方式</title>
      <link>/post/drush-prompt-for-input/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drush-prompt-for-input/</guid>
      <description>&lt;p&gt;Drush是个能让Drupal变简单的好东西。他不仅带有大量的有用工具，同时为用户提供了接口，让用户可以轻松实现自己的命令。如果你需要为你的模块创建Drush命令，只要创建一个包含这些功能命令即可。&lt;/p&gt;

&lt;p&gt;在这个教程中，我们会演示如何在这些命令中获取用户反馈。这里我不会提到参数或选项之类的东西。这里主要讲述的是，如何获取一个是或否的确认，或者如何提示用户进行一个选择。另外，我们也会说说如何获取用户输入的文本。&lt;/p&gt;

&lt;p&gt;首先让我们看一下*drush_module_name_example_command()*这个回调函数：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  /**
   * Callback function for the example command
   */
  function drush_module_name_example_command() {
    // Command code we will look at
    drush_print(&#39;Hello world!&#39;);
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;##确认&lt;/p&gt;

&lt;p&gt;首先我们要试验的是如何获取用户的确认。在我们的例子中，我们会请用户确认是否显示内容，可以用Drush API这样实现：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (drush_confirm(&#39;Are you sure you want \&#39;Hello world\&#39; printed to the screen?&#39;)) {
  drush_print(&#39;Hello world!&#39;);
}
else {
  drush_user_abort();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里有两个新函数：*drush_confirm()*这个函数显示一个问题，并尝试从用户合理获取&lt;strong&gt;y&lt;/strong&gt;或者&lt;strong&gt;n&lt;/strong&gt;的反馈。如果回复是&lt;strong&gt;y&lt;/strong&gt;，这个函数会返回&lt;strong&gt;true&lt;/strong&gt;，意味着我们输出的提示获得了确认；如果回应是&lt;strong&gt;n&lt;/strong&gt;，会调用*drush_user_abort()*。这也是推荐的中止Drush命令的方式。&lt;/p&gt;

&lt;p&gt;##选项&lt;/p&gt;

&lt;p&gt;接下来我们来看看，如何让用户从一系列列表中进行选择。在我们的超级例子Hello World中，我们将给用户提供一系列的选择，让用户决定Drush对谁说Hello。代码实现如下：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$options = array(
 &#39;world&#39; =&amp;gt; &#39;World&#39;,
 &#39;univers&#39; =&amp;gt; &#39;Univers&#39;,
 &#39;planet&#39; =&amp;gt; &#39;Planet&#39;,
);

$choice = drush_choice($options, dt(&#39;Who do you want to say hello to?&#39;));

if ($choice) {
  drush_print(dt(&#39;Hello @choice!&#39;, array(&#39;@choice&#39; =&amp;gt; $options[$choice])));
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上面的代码是做什么的呢？首先，我们创建了一个用于保存选项的*$options*数组。这个数组的键和值分别是选项的机器名称和描述。然后我们调用*drush_choice()&lt;em&gt;，两个参数分别是上面的&lt;/em&gt;$option*和用于提示用户的问题。&lt;/p&gt;

&lt;p&gt;当命令运行时，这个函数会返回用户选择项目的代码。接下来我们判断这个值是否存在，然后输出这个字符串。我们利用$option数组获取到用户选择内容。&lt;/p&gt;

&lt;p&gt;##用户输入内容&lt;/p&gt;

&lt;p&gt;第三种输入是自由输入的文本。当然这类内容的输入应该进行更加严格的校验，防止恶意输入影响系统。下面我们提示用户来输入他想要问好的目标：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$value = drush_prompt(dt(&#39;Who do you want to say hello to?&#39;));

drush_print(dt(&#39;Hello @value!&#39;, array(&#39;@value&#39; =&amp;gt;  $value)));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这个例子非常简单。当命令运行时，*drush_prompt()*函数会在终端显示我们输入的字符串。返回值由用户输入，接下来我们会输出这个返回值。不过请注意这只是示例代码，在真正使用这一功能时，请对用户的输入进行严格的检查。&lt;/p&gt;

&lt;p&gt;##结论&lt;/p&gt;

&lt;p&gt;这里介绍了三种不同的获取用户输入的Drush。前两种属于最常用的方式，第三种也有他的用武之地。当然——注意安全！&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>如何用Drush Make完成日常任务</title>
      <link>/post/drush-make-daily-tasks/</link>
      <pubDate>Wed, 05 Aug 2015 10:32:19 +0800</pubDate>
      <guid>/post/drush-make-daily-tasks/</guid>
      <description>&lt;p&gt;众所周知，Drupal Make在Drupal发行版的创建过程中具有重要作用，不过他对从来没有接触过发行版的人来说同样很有用，一个很好的例子就是&lt;a href=&#34;https://www.acquia.com/blog/patching-drush-make&#34; target=&#34;_blank&#34;&gt;《applying patches like a boss》&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;本文中我会展示在日常工作中我如何实用Drush Make来达成一些自动化目的，同时帮助我发现一些有趣的Drupal窍门。&lt;/p&gt;

&lt;p&gt;##Drush Make命令&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Drush Make内置两个命令：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;make&lt;/strong&gt;：把&amp;rdquo;&lt;strong&gt;.makefile&lt;/strong&gt;&amp;ldquo;转化为Drupal代码。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;make-generate&lt;/strong&gt;：从当前Drupal站生成&amp;rdquo;&lt;strong&gt;.makefile&lt;/strong&gt;&amp;ldquo;。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;两个命令都跟&amp;rdquo;&lt;strong&gt;.makefile&lt;/strong&gt;&amp;ldquo;有关，它是一种包含Drush Make指令的文本文件。延伸阅读：&lt;a href=&#34;https://github.com/drush-ops/drush/blob/master/docs/make.txt&#34; target=&#34;_blank&#34;&gt;.makefile语法&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;现在让我们开始深入一些学习Drush Make。&lt;/p&gt;

&lt;p&gt;##重建开发环境&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;日常工作中，我们经常会因为开发、测试或者演示的需要来安装一个新的干净的Drupal站。除去核心之外，一般还需要安装一些其他的一系列惯用模块，例如Administration Menu, Views或者其他一些什么东西。有了Drush Make，就可以把这个过程自动化，把所有需要的项目都包含到一个文件里面。&lt;/p&gt;

&lt;p&gt;下面是一个用于多语言测试的站点的&lt;strong&gt;.makefile&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;; Drush Make API version.
api = 2
; Drupal core.
core = 7.x

;Common modules.
projects[admin_menu][subdir] = &amp;quot;contrib&amp;quot;
projects[ctools][subdir] = &amp;quot;contrib&amp;quot;
projects[token][subdir] = &amp;quot;contrib&amp;quot;
projects[views][subdir] = &amp;quot;contrib&amp;quot;

; Development modules.
projects[devel][subdir] = &amp;quot;development&amp;quot;

; Multilingual modules.
projects[fallback_language_negotation][subdir] = &amp;quot;contrib&amp;quot;
projects[variable][subdir] = &amp;quot;contrib&amp;quot;
projects[i18n][subdir] = &amp;quot;contrib&amp;quot;
projects[i18nviews][subdir] = &amp;quot;contrib&amp;quot;

; Load some translations.
translations[] = de
translations[] = ru
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这个文件可以在本地进行保存（例如在&lt;strong&gt;~/.drush/make-files/d7_i18n.make&lt;/strong&gt;），也可以保存在远程服务器例如github。&lt;/p&gt;

&lt;p&gt;可以执行&lt;strong&gt;make&lt;/strong&gt;命令，通过这个文件在服务器上来创建我们的自定义环境（例如&lt;strong&gt;~/.drush/make-files/d7_i18n.make&lt;/strong&gt;）&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  $ drush make d7_i18n.make /var/www/drupal_test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;第一次执行可能会比较耗时，不过以后Drush会利用缓存节省很多时间。&lt;/p&gt;

&lt;p&gt;最后&lt;strong&gt;.makefile&lt;/strong&gt;中指定的最新版本的Drupal core, 第三方模块以及翻译文件都会被下载，并放置到指定位置。接下来，可以进入该站点的网址来运行install.php，或者使用Drush进行安装：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  $ drush si --db-url=&amp;quot;mysql://user:password@localhost/databasename&amp;quot; --site-name=&amp;quot;Drupal Multilingual&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;另外，还可以通过&amp;ndash;tar选项，为&lt;strong&gt;.makefile&lt;/strong&gt;生成tar包。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  $ drush make d7_i18n.make drupal_multilingual --tar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在其中加入一系列的Features(基于&lt;a href=&#34;https://drupal.org/project/features&#34; target=&#34;_blank&#34;&gt;Features模块&lt;/a&gt;)，就建立了你自己的发行版。&lt;/p&gt;

&lt;p&gt;##下载依赖关系&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;你有没有发现有些第三方模块提供了&lt;strong&gt;.make&lt;/strong&gt;或者&lt;strong&gt;.make.example&lt;/strong&gt;文件？这些通常包含了外部库的列表（例如Colorbox module中的jQuery Colorbox插件）。这些文件可以使用&lt;strong&gt;&amp;ndash;no-core&lt;/strong&gt;标志，在drupal站内部运行。例如我们要下载&lt;a href=&#34;https://drupal.org/project/chosen&#34; target=&#34;_blank&#34;&gt;Chosen&lt;/a&gt;模块：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ drush dl chosen Project chosen (7.x-2.0-beta4) downloaded to sites/all/modules/contrib/chosen. 
$ drush make sites/all/modules/contrib/chosen/chosen.make.example --no-core 
chosen downloaded from https://github.com/harvesthq/chosen/releases/download/v1.1.0/chosen_v1.1.0.zip 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在上个例子中，会下载和解压jQuery插件到&lt;strong&gt;libraries&lt;/strong&gt;文件夹中，这对使用者来说会非常方便。&lt;/p&gt;

&lt;p&gt;所以这里建议模块开发者，如果你试用了外部库，请在你的Drupal.org项目中添加一个&lt;strong&gt;.make.example&lt;/strong&gt;文件。还有其他办法也能达到这个目的，例如创建一个Drush命令&lt;strong&gt;chosen-plugin&lt;/strong&gt;，这需要&lt;a href=&#34;http://cgit.drupalcode.org/chosen/tree/drush/chosen.drush.inc?id=7.x-2.0-beta4&#34; target=&#34;_blank&#34;&gt;117行代码&lt;/a&gt;，而make的方式只需要&lt;a href=&#34;http://cgit.drupalcode.org/chosen/tree/chosen.make.example?id=7.x-2.0-beta4&#34; target=&#34;_blank&#34;&gt;7行代码&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;##为现存网站生成makefile&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;利用Drush Make可以轻易的共享自定义的Drupal。首先在Drupal根目录运行&lt;strong&gt;generate-makefile&lt;/strong&gt;命令：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ drush generate-makefile drupal_custom_build.make
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;生成的&lt;code&gt;drupal_custom_build.make&lt;/code&gt;文件中包含所有启用的项目版本的指令。如果一个项目中包含.git目录，Drush Make会自动设置相应的属性：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;projects[redirect][type] = &amp;quot;module&amp;quot;
projects[redirect][download][type] = &amp;quot;git&amp;quot;
projects[redirect][download][url] = &amp;quot;http://git.drupal.org/project/redirect.git&amp;quot;
projects[redirect][download][branch] = &amp;quot;7.x-1.x&amp;quot;
projects[redirect][download][revision] = &amp;quot;0b7b8dc2d58cb277874d87c91c45f0a361e148f7&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;生成的文件需要一些人工的审查工作。例如可以添加patch引用，在我的项目中为Redirect模块添加了两个补丁：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;projects[redirect][patch][] = &amp;quot;https://drupal.org/files/issues/redirect-global-905914-145.patch&amp;quot; 
projects[redirect][patch][] = &amp;quot;https://drupal.org/files/issues/redirect.circular-loops.1796596-146.patch&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;在你需要向其他同事共享你的工作环境，或为排错提供故障现场时，上面生成的&lt;strong&gt;.makefile&lt;/strong&gt;会非常有用。&lt;/p&gt;

&lt;p&gt;##帮助你探索Drupal世界&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;最后，Drush Make文件也是一个帮助用户了解发行版的工具。例如&lt;a href=&#34;http://cgit.drupalcode.org/commerce_kickstart/tree/drupal-org.make?id=refs/heads;id2=7.x-2.x&#34; target=&#34;_blank&#34;&gt;Commerce Kickstart&lt;/a&gt;或者&lt;a href=&#34;https://github.com/openscholar/openscholar/blob/SCHOLAR-3.x/openscholar/drupal-org.make&#34; target=&#34;_blank&#34;&gt;OpenScholar&lt;/a&gt;中包含的众多有趣的项目。&lt;/p&gt;

&lt;p&gt;最后，希望本文能够帮助读者更好的使用Drush，来完成日常任务，甚至建立自己的发行版。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
