If you wish to lock down the specific bytes included in a package, for example to have 100% confidence in being able to reproduce a deployment or build, then you ought to check your dependencies into source control, or pursue some other mechanism that can verify contents rather than versions.
У композера не иерархическая структура модулей, в нем нельзя иметь две версии одной библиотеки в проекте, иерархическая система модулей в npm дает такую возможность.
Модуль A может зависеть от модуля C v1.7, а модуль B от C v2.0.11 при этом оба модуля А и В бесконфликтно установятся в проект и подтянут свои зависимости локально.
В моем комменте выше акцент был на том, что мы имеем 2 различные версии библиотеки through. Это кстати пример из реального проекта, с актуальными версиями.
Но суть даже не в том, что мы можем лочить или нет версии зависимых библиотек, суть в том, что этого вообще не требуется, т.к. можно безбоязненно коммитить node_modules в реп и быть уверенным в том, что проект получит одни и те же библиотеки на всех инсталляциях.
Ну может быть это и реализуется технически, но зачем? Ведь можно просто добавить в реп node_modules и не иметь проблем.
lock был актуален для плоской схемы, в которой нельзя было иметь 2 версии одной и той же библиотеки, а глобальные модули имели приоритет. С npm это проблемы просто нет.
Не верно, в package.json вполне можно фиксировать версии, и npm install --save так и делает, суть в другом, т.к. локальные модули имеют приоритет перед глобальными, наличие кода модулей в репе, гарантирует то, что они будут использоваться.
А lock для _всех_ модулей создать в npm нельзя, так как они имеют иерархическую структуру, и каждая зависимость имеет свой package.json на содержимое которого мы влиять не можем.
Почитайте внимательнее, все очень подробно расписано, в том числе и вопрос фиксации версий.
А какое отношение имеют средства ЯП к костылям? Мне кажется тут наблюдается некоторое непонимание того, что называют «костылем» :)
Костыль — это быстрое, некрасивое и противоречащее архитектуре решение, сделанное для того чтобы «просто работало».
Вот например у себя в коде нашел, сначала клиент получал один набор событий, потом добавили еще, и вместо того что бы менять логику приложения просто нафигачили кода в EventEmitter-е:
Я вот не соглашусь с тем, что не стоит комментировать код в котором можно разобраться и так. Можно, но с комментариями проще. Хороший пример — backbonejs.org/backbone.js. Библиотека обильно прокомментирована и разобраться в ее внутренностях достаточно просто, попробуйте удалить все комменты и почитать код, станет гораздо грустнее.
Кстати, в каких типичных случаях приложение может кинуть исключение в асинхронном вызове не по вине программиста? На сколько я знаю, все популярные библиотеки пробрасывают ошибки первым аргументом в callback, разве что JSON.parse() в try/catch приходится оборачивать. Есть еще какие-нибудь юзкейсы?
Я бы сказал, что в последнее время erlang и clojure набирают обороты, так что я не настолько пессимистично настроен и в свободное от работы время почитываю SICP, чтоб в нужный момент быть в форме.
Вброшу цитатку из него для того чтобы интерес подогреть, тем более что к содержанию поста она некоторое отношение имеет :)
C++ — довольно таки примитивное, но монстровое поделие, полное исторически сложившихся нелепых нагромождений. Человек, который хорошо в нем ориентируется — это хорошее зубрилко а не хороший программист. Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу, в современно мире ценится разве что только среди прыщавых сосок. Работодатель же это сомнительное умение не ценит, и совершенно справедливо.
В том то и дело, что он мой user_id в табличке Actions добавляет в первичный автоматом, а если я потом снимаю PK с user_id руками, галочка id-relation тоже снимается, и связь fk_user опять становится пунктирной.
Кстати, возник у меня вопросик по workbench-у делал я в нем схемку, в которой две сущности были связаны M-N через две таблички, одна агрегирует всякие действия пользователя, другая собственно показывает относительно чего производилось действия, типа лайков коментов и т.д. Проблема следующая — по сути это ID-зависимость, но т.к. внешние ключи в разных таблицах, мне не нужно чтоб внешний ключ был частью первичного. Но когда я проставляю галочку ID в релейшене, workbench автоматически добавляет внешний ключ в первичный. Надеюсь, понятно описал проблему :) Можно ли это как-то побороть?
Дискретка — чрезвычайно полезный курс. Чуть ли не единственный предмет, знание которого требуется программисту практически ежедневно. Не стоит ей пренебрегать.
Но тем не менее, в описании shrinkwrap есть:
Модуль A может зависеть от модуля C v1.7, а модуль B от C v2.0.11 при этом оба модуля А и В бесконфликтно установятся в проект и подтянут свои зависимости локально.
В моем комменте выше акцент был на том, что мы имеем 2 различные версии библиотеки through. Это кстати пример из реального проекта, с актуальными версиями.
Но суть даже не в том, что мы можем лочить или нет версии зависимых библиотек, суть в том, что этого вообще не требуется, т.к. можно безбоязненно коммитить node_modules в реп и быть уверенным в том, что проект получит одни и те же библиотеки на всех инсталляциях.
Ну может быть это и реализуется технически, но зачем? Ведь можно просто добавить в реп node_modules и не иметь проблем.
lock был актуален для плоской схемы, в которой нельзя было иметь 2 версии одной и той же библиотеки, а глобальные модули имели приоритет. С npm это проблемы просто нет.
А lock для _всех_ модулей создать в npm нельзя, так как они имеют иерархическую структуру, и каждая зависимость имеет свой package.json на содержимое которого мы влиять не можем.
Почитайте внимательнее, все очень подробно расписано, в том числе и вопрос фиксации версий.
Костыль — это быстрое, некрасивое и противоречащее архитектуре решение, сделанное для того чтобы «просто работало».
Вот например у себя в коде нашел, сначала клиент получал один набор событий, потом добавили еще, и вместо того что бы менять логику приложения просто нафигачили кода в EventEmitter-е:
было:
стало:
Красиво? — нет. Работает? — да. :)
altsarev.livejournal.com/499347.html
и это решит все проблемы с обработкой асинхронных ошибок?
PS: Правда собирал gcc-4.7 а не 4.6 может версия компилятора не та…
© Xenocephal