开发 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

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

plugin.rb

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

创建符号链接

由于你遵循了我们的 开发者指南,你的计算机上应该已经检出(checkout)了一份 Discourse 代码副本。我将其检出到了 ~/code/discourse,但你也可以将其放在任何位置,只要相应地调整以下代码,它仍然可以正常工作:

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

上述代码在你的 Discourse 代码和你的插件文件夹之间创建了一个 符号链接。重新启动开发服务器后,你应该会发现你的插件正在运行!

这种设置的好处在于,你只需将插件提交到 GitHub,而无需担心它所在的 Discourse 代码库。你的更改将仅限于插件本身。如果你需要编辑 Discourse 的代码,你仍然可以这样做,但 Git 会单独跟踪这些更改!

我建议为插件代码库和 Discourse 本身分别使用一个编辑器窗口。将它们视为两个不同的事物会更容易处理。


系列中的更多内容

第 1 部分:插件基础
第 2 部分:插件插口
第 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 设置中使用符号链接。插件只能在直接复制到插件文件夹时才有效。