Автогенерация Visual Studio VsDoc для библиотеки JavaScript
Я нахожусь в процессе рефакторинга моей библиотеки JavaScript для использования единого пространства имен. У нас есть ~200 модулей, которые ранее были зарегистрированы как плагины jQuery или как глобальный объект (плохо). В прошлом разрешении, чтобы заставить Intellisense работать, я добавил ссылки на модули для каждого модуля (из которого я хотел Intellisense) как
/// <reference path="" />
в начало каждого файла модуля.
Все в предыдущем устроении было порочным, хрупким и не элегантным.
Я надеюсь исправить это в новом устроении. Одна из основных целей этого рефакторинга состоит в том, чтобы облегчить начинающим разработчикам работу в библиотеке, и Intellisense имеет большую выгоду.
В настоящее время я объединяю все файлы *.js в один файл nameSpace-vsdoc.js. Каждый метод каждого класса документируется с использованием синтаксиса vsdoc. Каждый модуль использует эту единственную ссылку vsdoc. Это работает хорошо, но это неуклюже. Intellisense работает на 300% лучше, чем раньше, но все еще недостаточно точен. Он пропускает большую часть моей XML-документации и не очень хорошо подходит для методов / классов, которые возвращают даже немного сложные объекты.
YUI Doc предлагает способ создания документации из синтаксиса JsDoc, но это не помогает с Intellisense. Глубокий поиск в душе не смог выявить каких-либо сторонних решений.
Существуют ли какие-либо инструменты для создания VsDocs более интеллигентным способом?
ОБНОВИТЬ:
После долгих размышлений, тестирования и пошагового рефакторинга у меня появилось простое пространство имен, похожее на это jsFiddle.
Это позволяет мне свободно писать пару модулей в самозапускающихся функциях, которые регистрируют нужные методы в пространстве имен. Все модули начинаются с:
/// <reference path="~/js/NameSpace-vsdoc.js" />
Я генерирую этот vsdoc с помощью простого сценария Perl, который я прикрепил к событию сборки VS 2010:
use strict;
my $dir = $ARGV[0];
my $destfile = "$dir\\js\\NameSpace-vsdoc.js";
unlink($destfile);
my $js = "";
$js .= extractFile("$dir\\js\\_first-vsdoc.js");
$js .= extractFile("$dir\\js\\NameSpace.js");
$js .= extract("$dir\\js\\modules");
#Add additional directories as needed
$js .= extractFile("$dir\\js\\_last-vsdoc.js");
open(VSDOC, "> $destfile") or die("Cannot open vsdoc file: $destfile ; $!");
print VSDOC $js;
close(VSDOC);
sub extract
{
my $ret = "";
my $path = $_[0];
opendir(JSDIR, $path) or die("Cannot open js directory: $path ; $!");
while((my $filename = readdir(JSDIR)))
{
if($filename =~ /.*\.js$/ &&
$filename !~ /-vsdoc/ &&
$filename !~ /_first/ &&
$filename !~ /_last/ &&
$filename !~ /.min\.js/)
{
$ret .= extractFile("$path\\$filename");
}
}
closedir(JSDIR);
return $ret;
}
sub extractFile
{
my $ret = "";
my $filename = $_[0];
open(JSFILE, "$filename") or die("Cannot open js file: $filename ; $!");
while((my $line = <JSFILE>))
{
if($line !~ m/-vsdoc\.js/ )
{
$ret .= $line;
}
}
close(JSFILE);
return $ret;
}
printf("Finished generating NameSpace vsdoc.\n");
Файлы _first-vsdoc.js и _last-vsdoc.js оборачивают все содержимое в самовыполняющуюся функцию. Затем я передаю полученный vsdoc в Closure Compiler, YUI Compressor и Uglify по мере необходимости / необходимости.
Этот процесс работает намного лучше, чем раньше, но все же он не лишен недостатков.
Начиная с нуля, в NewModule.js, который ссылается на NameSpace-vsdoc.js, я получаю правильный Intellisense:
Ns.register() //visible
Ns.controls.register() //visible
Ns.actions.register() //visible
Однако, когда я определяю NewModule.js как (и компилирую):
(function _alertClosure() {
Ns.register('alert', function alert(someText) {
///insert proper vsdoc style comment
});
}());
Я не получаю правильный Intellisense для:
Ns.alert() //no Intellisense help
что сбивает с толку, потому что он так хорошо работает в подпространствах имен. Я вынужден сделать это:
Ns.alert = Ns.alert || Ns.register('alert', function ....
Компилировать, и вдруг (очевидно) Intellisense работает как положено.
Intellisense работает с цепочечными методами с использованием vsdoc jQuery (который я тщательно изучал при построении этого процесса), а jQuery не прибегает к y.x = y.x || new x()
обман, чтобы это произошло.
Итак, вот пересмотренный вопрос: со структурной точки зрения единственное заметное различие, которое я могу ощутить между vsdoc и jQuery от jQuery, заключается в том, что jQuery собирает все пространство имен внутри одного и того же замыкания. Мое пространство имен и каждый из моих модулей заключены в отдельные замыкания. Для сравнения, мой vsdoc выглядит как длинная строка самовыполняющихся функций.
Просто слишком большой риск связан с отказом от шаблона замыкания / модуля; и это трудно проверить гипотезу в изоляции. Intellisense хорошо работает, когда библиотека мала и поэтому не может генерировать тысячи ошибок "Сообщение Javascript Intellisense: C:\\js\NameSpace-vsdoc.js(40:16): Требуется объект".
Идеи?
1 ответ
Я согласен с @Илья Володин. ReSharper - отличный инструмент для визуальной студии. Я пользуюсь им только месяц и без этого не могу.
Это не отвечает на ваш вопрос, но было бы очень полезно для вас.
Вот хорошее резюме, которое можно найти на официальном сайте:
"ReSharper - это известный инструмент для повышения продуктивности, благодаря которому Microsoft Visual Studio IDE становится намного лучше. Тысячи разработчиков. NET во всем мире задаются вопросом, как они когда-либо жили без проверок кода ReSharper, автоматизированного рефакторинга, быстрой доставки и помощи при написании кода".