开发 Discourse 插件 - 第 4 部分 - 配置 Git

上一教程:Developing Discourse Plugins - Part 3 - Add custom site settings


现在你的插件变得越来越复杂,是时候采用更专业的方式来开发它了。

我们建议使用 git 作为插件的版本控制工具。我们还推荐使用 github 与他人分享你的插件代码。

创建 Git 仓库

创建好 GitHub 账户后,访问 此链接 来创建一个新的仓库。你可以随意命名,但通常以 discourse- 开头是个不错的选择。请确保仓库是公开的。以下是我当时的屏幕截图:

创建本地工作目录

此时,我会在计算机上创建一个本地目录来存放插件。我通常将其放在 ~/code 下,但你也可以将其放在计算机上的任何位置:

mkdir -p ~/code/discourse-plugin-test
cd ~/code/discourse-plugin-test

现在,让我们按照 GitHub 的说明,通过 README 文件初始化仓库:

echo "# discourse-plugin-test" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:eviltrout/discourse-plugin-test.git
git push -u origin main

最后,按照 第一部分 中的说明,为你的插件创建一个 plugin.rb 文件。在这个示例中,我只创建了一个占位文件:

plugin.rb

# name: discourse-plugin-test
# about: Shows how to set up Git
# version: 0.0.1
# authors: Robin Ward

创建符号链接

由于你遵循了我们的 开发者指南,你的计算机上应该已经有一个 discourse 的代码副本。我将其检出到了 ~/code/discourse,但同样,你可以将其放在任何位置,只要相应地调整以下代码即可:

cd ~/code/discourse/plugins
ln -s ~/code/discourse-plugin-test .

上述代码在你的 discourse 代码和插件文件夹之间创建了一个符号链接。重启你的开发服务器,你应该会发现你的插件已经可以正常工作了!

这种设置的美妙之处在于,你可以直接将插件提交到 GitHub,而不必担心它所在的 discourse 代码库。你的更改将仅限于插件本身。如果你需要编辑 discourse 的代码,你仍然可以这样做,但 git 会单独跟踪这些更改!

我建议使用一个编辑器窗口来查看插件代码库,另一个窗口来查看 Discourse 本身。当你把它们视为两个不同的东西时,这样会更简单。


系列教程

第 1 部分:插件基础
第 2 部分:插件出口 (Plugin Outlets)
第 3 部分:站点设置
第 4 部分:本主题
第 5 部分:管理界面
第 6 部分:验收测试
第 7 部分:发布你的插件


本文档受版本控制 - 请在 github 上建议更改。

23 个赞
  • After many frustrating attempts, found out that apparently ln -s does not work in a Windows environment, or atleast not how it should.
  • ln -s essentially just copy-pasted the plugin folder into the discourse/plugins folder
  • Apparently, in Windows the way to create symbolic links is to use the mklink command in command prompt (run as administrator, and this command does not natively run in Windows PowerShell either).
  • Using the mklink command (with both arguments /d and /h), although the created symbolic link could be seen present in the directory, the plugin was not working with discourse (and also not showing in /admin/plugins).
  • I tried this multiple times with restarting the rails server, deleting the tmp folder, but to no avail.

@eviltrout, any idea what could I be doing wrong?

2 个赞

I assume you are using Vagrant on windows? If you can’t get the symbolic links sent over, I think the only way you can do it is to copy the plugin into discourse/plugins manually and work from there. It should work as long as you are not making changes to the core discourse app at the same time, which confuses git.

When your plugin is ready, you’ll want to copy it to another directory to package it up for git.

1 个赞

Yeah, OK this should be fine too.
Although the OCD side of me, much preferred the comparatively “cleaner” symbolic links method.

Anyway, Thanks.

@AhmadF.Cheema I had similar problems with the symlinking using Vagrant 1.9.8 on Linux, and a completely standard Discourse Vagrant development environment as per the docs.

The problem is simple when you look into it. From the scope of inside the Vagrant VM, the destination of the symlink is not a valid path. Try executing the command ls -al in the plugins directory inside your VM (in a standard install this is at /vagrant/plugins)

vagrant@discourse:/vagrant/plugins$ ls -al
total 36
drwxr-xr-x 1 vagrant vagrant 4096 Oct 22 09:08 ./
drwxr-xr-x 1 vagrant vagrant 4096 Oct 22 09:10 ../
drwxr-xr-x 1 vagrant vagrant 4096 Sep  7 19:51 discourse-details/
drwxrwxr-x 1 vagrant vagrant 4096 Oct 21 13:56 discourse-narrative-bot/
drwxr-xr-x 1 vagrant vagrant 4096 Oct 21 13:56 discourse-nginx-performance-report/
drwxr-xr-x 1 vagrant vagrant 4096 Sep  7 19:51 discourse-plugin-outlet-locations/
drwxrwxr-x 1 vagrant vagrant 4096 Oct 21 13:56 discourse-presence/
lrwxrwxrwx 1 vagrant vagrant   55 Oct 22 09:08 my-basic-plugin -> /home/marcus/code/discourse/my-basic-plugin
drwxr-xr-x 1 vagrant vagrant 4096 Oct 21 13:56 lazyYT/
drwxr-xr-x 1 vagrant vagrant 4096 Oct 21 13:56 poll/

As you can see, the path /home/marcus/code/discourse/my-basic-plugin cannot possibly be accessible from the VM because it doesn’t exist inside the VM!

The solution is to delete the externally created symlink and set up a separate shared folder in Vagrant, by adding a line to your Vagrantfile:

config.vm.synced_folder "/home/marcus/code/my-basic-plugin",  "/my-basic-plugin"

Then restart the Vagrant VM: vagrant halt && vagrant up so that this change is picked up

Now, when you enter your VM via SSH using vagrant ssh you can create a symlink inside the VM:

cd /vagrant/plugins
ln -s /my-basic-plugin .

Now you can develop in a neatly isolated local folder, and have the neat Git workflow that @eviltrout describes, and the symlinking happens inside the VM. Note that outside the VM, the symlink will be broken - but this shouldn’t matter for our purposes.

3 个赞

If you are developing on Linux using our docker based dev is way simpler

4 个赞

Windows symlinks are different from Unix symlinks, thus your confusion. Windows synlinks are very fussy, requiring particular versions of OS to support and sometimes applications must be written to be aware of this. In other words, the stars must line up perfectly for windows symlinks to work.

A hard link (/H) I dont think work with directories. Your /D makes a symlink on a directory, trumping your /H (which is used to create a hard link to a file, not a directory).

Confusing? Welcome to Windows.

There are four types of links in Windows:

  • MKLINK (no flags) – symbolic link to file
  • MKLINK /H – hard link to file
  • MKLINK /D – symbolic link to directory
  • MKLINK /J – junction (i.e. hard link) to directory

What you need is is a junction which is Windows-speak for hard link to a directory.

Do MKLINK /J to your plugins directory and the system will treat it as a subdirectory. In fact it won’t know otherwise. Beware, it is not common to have a Windows directory (folder in Windows-speak) to point to the same place as another directory, so you’ll get confused very easy and forget that both are the same things.

That’s why you’ll need to run the command in Administrator mode, otherwise Windows won’t let you create the directory junction.

4 个赞

Thanks for the info regarding Windows symlinks @schungx - it should be of help to the OP.

The workaround I described should work fine on any platform, since the symlinks happen inside the (Ubuntu) vagrant box

M

Yup, you’re right. If you can avoid it, avoid messing with Windows. Windows is very picky and may choose to die or go wrong at the most unfortunate moment…

Work for me! 2018-4-29

1. I put discourse & my plugin in Desktop

instead of put 1c7-plugin under discourse/plugin

2. and put a “alias” into discourse/plugins folder

alias is a macOS concept,
it’s the same things as ln -s command

3. Discourse correctly load the plugin

(After reboot server with rails s)

4. Now they are separated, use git to manage code is much easier

Thanks!

无法在 macOS Docker 设置中使用符号链接。插件只能在直接复制到插件文件夹时才有效。