Лучшие практики для развертывания инструментов и сценариев к производству?

2013 и 2015 Update (см. ниже первоначальный ответ от 2011 г.) :

Это изменилось с ES2015 (иначе ES6): JavaScript теперь имеет прокси . Прокси позволяют создавать объекты, которые являются истинными прокси-серверами для (фасадов) других объектов. Вот простой пример, который превращает любые значения свойств, которые являются строками для всех кепок при извлечении:

var original = {
    "foo": "bar"
};
var proxy = new Proxy(original, {
    get: function(target, name, receiver) {
        var rv = target[name];
        if (typeof rv === "string") {
            rv = rv.toUpperCase();
        }
        return rv;
      }
});
console.log("original.foo = " + original.foo); // "bar"
console.log("proxy.foo = " + proxy.foo);       // "BAR"

"use strict";
(function() {
    if (typeof Proxy == "undefined") {
        console.log("This browser doesn't support Proxy");
        return;
    }
    var original = {
        "foo": "bar"
    };
    var proxy = new Proxy(original, {
        get: function(target, name, receiver) {
            var rv = target[name];
            if (typeof rv === "string") {
                rv = rv.toUpperCase();
            }
            return rv;
        }
    });
    console.log("original.foo = " + original.foo); // "bar"
    console.log("proxy.foo = " + proxy.foo);       // "BAR"
})();

Операции, которые вы не выполняете override имеют свое поведение по умолчанию. В приведенном выше случае все, что мы переопределяем, - get, но есть целый список операций, в которые вы можете подключиться.

В списке аргументов функции обработчика get:

  • target - объект, который проксирован (original, в нашем случае).
  • name - это (конечно) имя возвращаемого свойства.
  • receiver - либо сам прокси, либо что-то, что наследует от него. В нашем случае receiver является === proxy, но если proxy использовались в качестве прототипа, receiver может быть потомком, следовательно, он находится на сигнатуре функции (но в конце, поэтому вы может легко оторваться от него, если, как и в нашем примере выше, вы на самом деле не используете его).

Это позволяет вам создать объект с требуемой функцией getter и setter :

var obj = new Proxy({}, {
    get: function(target, name) {
        if (!(name in target)) {
            console.log("Getting non-existant property '" + name + "'");
            return undefined;
        }
        return target[name];
    },
    set: function(target, name, value) {
        if (!(name in target)) {
            console.log("Setting non-existant property '" + name + "', initial value: " + value);
        }
        target[name] = value;
        return true;
    }
});

console.log("[before] obj.foo = " + obj.foo);
obj.foo = "bar";
console.log("[after] obj.foo = " + obj.foo);

"use strict";
(function() {
    if (typeof Proxy == "undefined") {
        console.log("This browser doesn't support Proxy");
        return;
    }

    var obj = new Proxy({}, {
        get: function(target, name) {
            if (!(name in target)) {
                console.log("Getting non-existant property '" + name + "'");
                return undefined;
            }
            return target[name];
        },
        set: function(target, name, value) {
            if (!(name in target)) {
                console.log("Setting non-existant property '" + name + "', initial value: " + value);
            }
            target[name] = value;
            return true;
        }
    });

    console.log("[before] obj.foo = " + obj.foo);
    obj.foo = "bar";
    console.log("[after] obj.foo = " + obj.foo);
})();

(Обратите внимание, как я покинул функции receiver, так как мы не receiver является необязательным четвертым аргументом arg set.)

Выходной сигнал выше:

Getting non-existant property 'foo'
[before] obj.foo = undefined
Setting non-existant property 'foo', initial value: bar
[after] obj.foo = bar

Обратите внимание, как мы получаем «несуществующее» сообщение, когда мы пытаемся извлечь foo, когда оно еще не существует, и снова, когда мы его создаем, но не впоследствии.


Ответ от 2011 года ( см. выше для обновлений 2013 и 2015 годов) :

Нет, JavaScript не обладает функцией полного доступа. Используемый синтаксис аксессора рассматривается в в разделе 11.1.5 спецификации и не предлагает никакого подстановочного знака или что-то в этом роде.

Вы могли, конечно, реализовать функцию, чтобы сделать это, но я предполагаю, что вы, вероятно, не хотите использовать f = obj.prop("foo");, а не f = obj.foo; и obj.prop("foo", value);, а не obj.foo = value; (что было бы необходимо, чтобы функция обрабатывала неизвестные свойства) .

FWIW, функция getter (я не беспокоила логику сеттера) выглядела бы примерно так:

MyObject.prototype.prop = function(propName) {
    if (propName in this) {
        // This object or its prototype already has this property,
        // return the existing value.
        return this[propName];
    }

    // ...Catch-all, deal with undefined property here...
};

Но опять же, я не могу себе представить, что вы действительно хочу это сделать, из-за того, как он изменяет способ использования объекта.

17
задан Ludwig Weinzierl 30 May 2009 в 10:05
поделиться

6 ответов

Смотрите на cfengine учебное руководство , чтобы видеть, похож ли cfengine на правильный инструмент для Вашей ситуации. Это может быть немного слишком сложно для маленького веб-сайта, но если это соберется включить больше компьютеров и больше конфигурации в будущем, в какой-то момент Вы закончите тем, что использовали cfengine или что-то как этот.

3
ответ дан 30 November 2019 в 13:05
поделиться

Создайте свои собственные пакеты в формате Ваше использование распределения, например, пакеты Debian (.deb). Они могут или быть скопированы в каждую машину и установлены вручную, или можно открыть собственный репозиторий и добавить его к списку источников.

Ваши пакеты должны быть настроены так, чтобы сценарии, которые они содержат, консультировались с конфигурационным файлом, который отличается на каждом хосте, в зависимости от того, какие сценарии должны быть выполнены на каждом.

Для связывания всего этого можно создать meta пакет, который просто зависит от каждого из других пакетов, которые Вы создаете. Тот путь при установке нового сервера Вы устанавливаете тот один meta пакет, и другие пакеты вводятся как зависимости.

, Хотя этот процесс звучит немного сложным, если у Вас есть много сценариев и много хостов для развертывания их на, это может действительно окупиться в конечном счете.

2
ответ дан 30 November 2019 в 13:05
поделиться

Я должен развернуть Сценарии PHP и конфигурации Apache нескольким клиентам на частой основе. Так как они все запускают Linux Debian, я настроил хранилище пакетов Debian на своем сервере, и весь клиент должен сделать, склонный тип - получают обновление , и они получают последнюю версию.

1
ответ дан 30 November 2019 в 13:05
поделиться

Марионетка является другим инструментом, который может использоваться в этой ситуации. Это подобно cfengine - Вы создаете модель желаемого развертывания и Марионеточные числа, как получить среду к этому состоянию.

1
ответ дан 30 November 2019 в 13:05
поделиться

Первое, что нужно сделать, получают все эти сценарии в репозиторий управления исходным кодом (svn, или мерзавец хороши) так, чтобы можно было отследить изменения в этих сценариях со временем.

, Если Вы интересуетесь рубином, проверьте Capistrano, он хорошо подходит, развертывая вещи на нескольких машинах в кластере и довольно легок настроить. Это может считать файлы непосредственно из Вашей системы управления версиями.

0
ответ дан 30 November 2019 в 13:05
поделиться

Здесь есть несколько категорий инструментов. Некоторые люди используют комбинацию инструментов из этих категорий. Я иногда использую, например, и Puppet, и Capistrano. См. Puppet или Capistrano - Используйте правильный инструмент для работы для обсуждения.

Инструменты сценария, предназначенные для развертывания приложения:

Общий шаблон с инструментами в этой категории заключается в том, что вы создаете сценарий и / или конфигурационный файл, часто с наборами команд, аналогичными Makefile, и инструмент подключится к вашему производственному блоку по ssh, выполнит проверку исходного кода и выполнит все остальные необходимые шаги.

Инструменты в этой области обычно есть возможности для отката к предыдущей версии. Таким образом, они проверит ваш исходный код в каталог Release / и создадут символическую ссылку от «current» до «Release /», если все пойдет хорошо. Если есть проблема, вы можете вернуться к предыдущей версии, выполнив команду, которая удалит «текущую» и свяжет ее с предыдущим каталогом release /.

  • Capistrano принадлежит сообществу Rails, но является универсальным. Пользователи Capistrano могут быть заинтересованы в deprec , наборе рецептов развертывания для Capistrano.
  • Vlad the Deployer - альтернатива Capistrano, опять же от сообщества Rails.
  • Напишите свой собственный сценарий оболочки или Makefile.

Варианты получения файлов в производственный ящик:

  • Прямая выписка из источника. Не всегда это возможно, если в ваших производственных боксах отсутствуют инструменты разработки, в частности инструменты управления исходным кодом.
  • Получите исходный код локально, а затем заархивируйте его. Используйте scp или rsync, чтобы скопировать архив. Иногда это предпочтительнее для чего-то вроде развертывания Amazon EC2, где сжатый tarball может сэкономить время / пропускную способность.
  • Оформить заказ локально, а затем rsync его с производственной коробкой.

Packaging Tools

Используйте упаковку вашей ОС система для создания пакетов, содержащих файлы для вашего приложения. Создайте главный пакет, в котором есть зависимости от других необходимых вам пакетов. Система RubyWorks является примером этого, используемого для развертывания стека Rails и примера приложения. Затем нужно использовать apt, yum / rpm, Windows msi или что-то еще для развертывания данной версии. Откат включает в себя удаление и переустановку старой версии.

Общие инструменты, предназначенные для установки приложений / конфигураций и обслуживания набора систем

Эти инструменты не нацелены конкретно на проблему развертывания веб-приложения, а скорее более общая проблема развертывания / поддержки приложений / конфигураций для набора серверов или рабочих станций всей компании. Они больше нацелены на системного администратора, чем на веб-разработчика, хотя оба могут найти их полезными.

  • Cfengine - инструмент из этой категории.
  • Puppet нацелен на улучшение Cfengine. У него есть кривая обучения, но многие считают, что стоит потратить время на то, чтобы выяснить, как делать конфигурации. После того, как вы его запустили, каждый ящик периодически проверяет центральный сервер и проверяет, все ли обновлено. Если кто-то редактирует файл или изменяет разрешение, это обнаруживается и исправляется. Таким образом, в отличие от вышеупомянутых инструментов развертывания, Puppet не только помещает файлы в нужное место, но и гарантирует, что они останутся такими.
  • Chef немного моложе Puppet с аналогичным подходом.
19
ответ дан 30 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: