Wie behebe ich den Fehler "Modul kann nicht gefunden werden" mit Node.js?


616

Nachdem ich ein Modul von GitHub heruntergezogen und die Anweisungen zum Erstellen befolgt habe, versuche ich, es mit folgenden Elementen in ein vorhandenes Projekt zu ziehen:

> npm install ../faye

Dies scheint den Trick zu tun:

> npm list
/home/dave/src/server
└─┬ faye@0.7.1
  ├── cookiejar@1.3.0
  ├── hiredis@0.1.13
  └── redis@0.7.1

Aber Node.js kann das Modul nicht finden:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

Ich möchte wirklich verstehen, was hier vor sich geht, aber ich weiß nicht, wo ich als nächstes suchen soll. Irgendwelche Vorschläge?


8
Es node_moduleswird erwartet, dass sich das Verzeichnis im Stammverzeichnis Ihres Projekts befindet, app.jsin Ihrem Fall auch. Warum haben Sie ..den npm-Installationspfad verwendet?
Alex Wayne

1
Nach dem Ändern von "npm install ../faye" in "npm install ../faye/build" funktioniert es wie erwartet. Ich weiß nicht, wie typisch das ist, aber Faye erstellt beim Erstellen ein Build-Verzeichnis und legt dort eine Kopie von package.json ab. npm beschwert sich nicht über package.json auf der Stammebene, verweist jedoch auf Dateien, die auf dieser Ebene nicht vorhanden sind.
Dave Causey

2
Ich habe das Problem gelöst, aber keine wirkliche Lösung für meine eigentliche Frage gefunden, wie dieses Problem behoben werden kann. Ich werde versuchen, einige Vorschläge zur Verbesserung von npm und / oder node zu machen, um es Neulingen zu erleichtern, diese Situation zu vermeiden.
Dave Causey

1
Wenn Sie diesen Link durchgehen , erhalten Sie möglicherweise eine Vorstellung davon, wo genau Ihre Module nicht nachgeschlagen werden können.
Amol M Kulkarni

1
Überprüfen Sie, ob Sie sich in demselben Ordner befinden, in dem Sie es installiert haben? wenn Sie es nicht global installiert haben.
Ashwani Panwar

Antworten:


513

Mit npm installinstalliert das Modul nur im aktuellen Verzeichnis (in einem Unterverzeichnis namens node_modules). Befindet sich app.js unter home/dave/src/server/? Wenn dies nicht der Fall ist und Sie das Modul aus einem beliebigen Verzeichnis verwenden möchten, müssen Sie es global mit installieren npm install -g.

Normalerweise installiere ich die meisten Pakete lokal, damit sie zusammen mit meinem Projektcode eingecheckt werden.

Update (8/2019):

Heutzutage können Sie die Datei package-lock.json verwenden, die automatisch generiert wird, wenn npm Ihr Verzeichnis node_modules ändert. Daher können Sie das Einchecken von Paketen package-lock.jsonweglassen, da die genauen Versionen Ihrer node_modules verfolgt werden, die Sie derzeit verwenden. Zum Installieren von Paketen aus , package-lock.jsonanstatt package.jsonVerwendung des Befehls npm ci.

Update (3/2016):

Ich habe viel Flak für meine Antwort erhalten, insbesondere, dass ich die Pakete einchecke, von denen mein Code abhängt. Vor ein paar Tagen hat jemand alle Pakete ( https://kodfabrik.com/journal/i-ve-just-liberated-my-modules ) veröffentlicht, die React, Babel und so ziemlich alles andere kaputt gemacht haben. Hoffentlich ist jetzt klar, dass Sie sich bei Produktionscode nicht darauf verlassen können, dass NPM Ihre Abhängigkeiten tatsächlich für Sie beibehält.


264
"Normalerweise installiere ich die meisten Pakete lokal, damit sie zusammen mit meinem Projektcode eingecheckt werden." In der Regel ist es besser, eine package.jsonListe der npm-Module zu erstellen, von denen Sie abhängig sind, und den node_modulesOrdner zu ignorieren . Dann einfach npm install, um das Setup zu erhalten, nachdem Sie das Repo geklont haben.
Alex Wayne

53
Zusätzlich zur package.jsonAuflistung der Abhängigkeiten möchte ich gute Kopien von Dingen aufbewahren, von denen ich abhängig bin. Der Speicherplatz ist billig und wenn npm oder das Paket von npm verschwindet, habe ich immer noch ein voll funktionsfähiges Projekt in meinem Repo.
Bill

165
Als alter Entwickler wäre ich fast erstickt, als ich das "Paradigma" der Node-Entwickler las, dass "Speicherplatz billig ist". Ich habe Bibliotheken, die ich benutze. Die Idee, dass ich 100 Kopien haben könnte (oder schlimmer noch, in der Nähe von Kopien), lässt meinen Magen verdrehen. Speicherplatz ist billig, aber Wartungszeit ist teuer. Wenn Sie ein einmaliges Spielzeugprojekt durchführen, ist die Wartung möglicherweise günstig. Für echte Arbeiten ist die Wartung jedoch teuer und hat keinen Einfluss auf die Kosten für den Speicherplatz.
Lloyd Sargent

66
Ich verstehe diesen letzten Kommentar wirklich nicht. Niemand sagt, dass er 100 Kopien eines Codes haben soll, nur 1 Kopie des Codes, von dem Ihr Projekt abhängt. Die Alternative besteht darin, ein nicht funktionierendes Projekt zu haben, wenn NPM oder die Abhängigkeit eines Tages verschwinden. Ich würde denken, dass das Umschreiben einer Abhängigkeit von Grund auf auch ziemlich teuer ist. Abgesehen davon habe ich 10 Jahre bei Microsoft gearbeitet und wir haben immer Abhängigkeiten von Drittanbietern in unseren Quellbaum eingecheckt.
Bill

33
@LloydSargent "NEAR-Kopien" zu haben ist nicht schlechter, es ist besser , weil jedes Projekt eine bestimmte Abhängigkeit hat, die Sie definiert haben, und der Rest Ihres Codes davon abhängt. Wenn Sie die hatten gleiche Versionen über mehrere Projekte dann , wenn Sie aktualisieren , alles Sie müssen aktualisieren alles . Das Fixieren von Abhängigkeiten ermöglicht stückweise Upgrades - wesentlich weniger Wartung. Echte Arbeit, Nicht-Spielzeug-Projekte.
Dave Newton

459

Ich hatte ein sehr ähnliches Problem. Das Entfernen des gesamten node_modulesOrdners und das erneute Installieren haben bei mir funktioniert:

rm -rf node_modules
npm install

13
Ich würde auch einen npm Cache sauber machen, nur aus Sicherheitsgründen :)
Tony Tai Nguyen

1
Wahrscheinlich ein guter erster Schritt zur Fehlerbehebung , wenn eine seltsame Abhängigkeitsproblem erscheint , dass npm install/ npm updatenicht lösen wird. Dies löste ein Problem, bei dem Error: Cannot find module 'http-errors'zufällig angezeigt wurde, als ich versuchte, meine Express-App auszuführen.
Matt Vukas

Erstaunlich, @ carelesslyChoosys Antwort löste eine fehlende Abhängigkeit. Es scheint, dass ein Upgrade und Downgrade mit der installierten npm-Installation die Dinge nicht aufgeräumt hält.
Aal Gheez

3
Ein fehlender Schritt besteht darin, die Datei package-lock.json vor dem Ausführen zu entfernen npm install.
Rick Quantz

das hat bei mir nicht funktioniert, sogar den Computer neu gestartet;)
Jason G

83
npm install --save module_name

Zum Beispiel, wenn der Fehler ist:

{[Fehler: Modul '/root/.npm/form-data' kann nicht gefunden werden] Code: 'MODULE_NOT_FOUND'}

Anschließend können Sie dieses Problem beheben, indem Sie den Befehl ausführen npm install --save form-data.


1
Es scheint, als ob ich es global installiert habe. Der Ordner npm / node-modules war leer und ich habe versucht, ihn zu verwenden. ng new project-nameEs wurden einige fehlende Module angezeigt. Ich musste sie jeweils mit dem angegebenen Befehl installieren. Dann wurde das Problem behoben, aber es ist Gibt es einen einzigen Befehl, um alle auf einmal zu installieren?
Vishal Nair

25

Für Typoskript Benutzer, ein Einbau-Node - Modul (wie wenn Sie importieren http, pathoder url) und Sie bekommen einen Fehler wie "Cannot find module "x"dann kann der Fehler durch Lauf fixiert werden

npm install @types/node --save-dev

Der Befehl importiert die NodeJS TypeScript-Definitionen in Ihr Projekt, sodass Sie die integrierten Module von Node verwenden können.


18

Dies geschieht, wenn eine erste npm- Installation aus irgendeinem Grund abgestürzt ist (SIGINT von npm) oder wenn die Verzögerung zu lang war oder Daten beschädigt sind. Wenn Sie erneut versuchen, eine npm-Installation durchzuführen, wird das Problem nicht behoben.

Bei der ersten Überprüfung von npm ist ein Fehler aufgetreten. Daher ist es am besten, die Datei zu entfernen und die npm-Installation neu zu starten.


16
Dies diagnostizierte das Problem für mich. i am Ende tun npm cache clearund node_modules gefolgt Ausräumen npm installmeines Problem zu beheben.
Meklarian

9

Wenn Sie nvm verwenden, überprüfen Sie, ob vorhandene node_modules, die Bindungen zu anderen Bibliotheken darstellen, für die richtige Node.js-Version kompiliert wurden.

Ich hatte den gleichen Fehler. Der Grund war folgender: Wir verwenden nvm, da wir zwei Apps auf einem Server ausführen. Eine erfordert Node.js 5.6, da Node-gd verwendet wird (das derzeit nicht auf Node.js 6 ausgeführt wird), die andere erfordert Node.js 6. Node.js 6 ist die apt-get- Installation.

Außerdem verwenden wir das pm2-Tool zum Bereitstellen.

Die Standardeinstellung ist also, dass der pm2-Prozess gestartet wird, wenn nvm nicht aktiv ist. Daher wird die apt-get-Installation von Node.js (Version 6) verwendet. Der Hauptdämon pm2 startet also mit Node.js 6. Wenn ich Anwendungen im Fork-Modus ausführe, werden sie in separaten Prozessen gestartet und die NVM-Einstellungen sind wirksam. Wenn ich Anwendungen im Cluster-Modus ausführe, erben sie die Nicht-NVM-Umgebung.

Als ich versuchte, in den Cluster-Modus zu wechseln, konnte die Anwendung nicht gestartet werden, da die für 5.6 kompilierten Bindungen mit dieser Meldung fehlschlagen.

Ich habe das behoben, indem ich pm2 neu gestartet habe, wenn die NVM-Einstellungen wirksam sind. Auch Startskripte sollten behoben werden.


Wie überprüfen Sie das?
Tamj0rd2

8

Überprüfen Sie, ob die Umgebungsvariable NODE_PATH richtig eingestellt ist und auf den Pfad node_modules zeigt. nodejs verwendet diese Variable, um nach den Bibliotheken zu suchen


Ich habe dies positiv bewertet, da es mein unmittelbares Problem gelöst hat, und mich zu dieser Dokumentation zu node.j geführt . Ich denke jedoch, dass dies keine pauschale Antwort ist, da die Dokumentation alternative Strategien zum Auffinden von Modulen aufzeigt.
Graham Klyne

6

Ich habe diesen Fehler gestern erlebt. Es dauerte eine Weile, bis mir klar wurde, dass der mainEintrag in package.jsonauf eine Datei zeigte, die ich verschoben hatte. Sobald ich aktualisiert habe, dass der Fehler verschwunden ist und das Paket funktioniert hat.


2
Heilige Kuh ... aus Verzweiflung habe ich "Fehler: Modul kann nicht gefunden werden" in Google eingegeben und diese Frage gefunden. Ihre Antwort hat mein Problem behoben. Ich kann nicht glauben, dass ein so vager Suchbegriff die richtige Antwort war. Ein großes Lob an Sie und an Google!
Jamon Holmgren

1
Sehr viel das. Ich hatte es geschafft, den mainEintrag für mein Submodul in ein Verzeichnis zu verweisen, das aus seinem Repository ausgeschlossen war. Als ich versuchte, ihn über das Repository aufzunehmen, npm installfunktionierte dies, aber es wurden keine Exporte gefunden, wenn dies erforderlich war. Vielen Dank für diese offensichtliche, aber nützliche Antwort.
Dragos

Danke dafür. Ich hatte diese Situation bei der Verwendung von Garnarbeitsbereichen und suchte überall nach Algorithmen für die Pfadauflösung und allen möglichen Arten. :) Ich war beeindruckt von der Art und Weise, wie die Fehlermeldung vom "Auffinden" des Moduls spricht, und auch davon, dass ESLint ähnliche Fehlermeldungen ausgibt. Und dann sah ich deine Antwort und erkannte, dass ich ein Trottel war. Vielen Dank!
Mark Birbeck

5

Entfernen Sie Ihren node_moduleStammordner aus Ihrem Projekt (zB :) myApp. Gehen Sie zum myAppOrdner und geben Sie den folgenden Befehl vom Terminal aus ein

>myApp>npm install

Es werden alle für Ihr Projekt erforderlichen Abhängigkeitsmodule installiert.


Könnten Sie bitte Ihre Antwort näher erläutern und etwas mehr Beschreibung der von Ihnen bereitgestellten Lösung hinzufügen?
Abarisone

5

Dieser Fehler kann auftreten, wenn Sie requireein Modul verwenden, maindessen package.json ein fehlendes oder falsches Feld enthält. Obwohl das Modul selbst installiert ist, muss npm / node eine einzelne .js-Datei als Einstiegspunkt für Ihr Modul verwenden. Wenn das mainFeld nicht vorhanden ist, wird standardmäßig index.jsim Ordner Ihres Moduls gesucht . Wenn die Hauptdatei Ihres Moduls nicht index.js heißt, kann es nicht require.

Wird entdeckt, während aus einem browserifyModul ein CommonJS- requirefähiges Modul wird. browserifyDas fehlende mainFeld war mir egal , und so war der Fehler unbemerkt geblieben.


4

Geben Sie den Pfad zum Restler-Ordner an, der sich im Ordner node_modules befindet, wie: var rest = require ('./ node_modules / restler');

Das hat bei mir funktioniert.


3

Wenn Sie Typoskript verwenden und nach der Installation aller Knotenmodule eine Fehlermeldung erhalten, entfernen Sie diese package-lock.json. Und dann renn npm install.


2

PRO TIPP:

Dieser Fehler ist mir im Kampf gegen Müdigkeit und leichte Krankheit passiert, weil ich node blahstattdessen getippt habe npm blah.

Die erhaltene Fehlermeldung war nicht böse genug, um mich auf meine eigene Torheit aufmerksam zu machen!


2

Ich hatte das gleiche Problem, als jemand anderes im Team package.jsonin SVN aktualisiert wurde. Das bloße Entfernen des node_modulesVerzeichnisses hat nicht geholfen. Wie ich das Problem gelöst habe ist:

rm -rf node_modules
rm package.json
rm package-lock.json
svn up
npm install
ng build --env=prod

Hoffe das hilft jemandem!


Danke für die Erinnerung. In meinem Fall war es package-lock.json, der die Dinge wieder durcheinander brachte, aber nach dem Löschen und node_modules ist npm installalles wieder in Ordnung .
TaeKwonJoe

6
Wenn Sie entfernen, package.jsonwoher weiß NPM, was zu installieren ist?
Michał

1

Ich kann noch einen Ort hinzufügen, um zu überprüfen; Das Paket, das ich verwenden wollte, war ein weiteres meiner eigenen Pakete, die ich in einem privaten NPM-Repo veröffentlicht hatte. Ich hatte vergessen, die 'main'-Eigenschaft in der package.json richtig zu konfigurieren. Das Paket befand sich also im Ordner node_modules des konsumierenden Pakets, aber ich erhielt die Meldung "Modul kann nicht gefunden werden". Ich brauchte ein paar Minuten, um meinen Fehler zu erkennen. :-(


1

In meinem Fall hatte ich UNMET PEER DEPENDENCY redux@^3.0.0diese Fehlermeldung verursacht, sehen Sie alle und installieren Sie fehlende Module erneut mit --save

npm install redux --save

1

Das Entfernen von node / npm und das erneute Installieren der stabilen (nicht der neuesten) Version hat bei mir funktioniert.

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

https://nodejs.org/en/download/


0

Ich habe versucht, mein eigenes Paket zu veröffentlichen und es dann in ein anderes Projekt aufzunehmen. Ich hatte dieses Problem, weil ich das erste Modul erstellt habe. Ich verwende den ES2015-Export, um das Modul zu erstellen. Nehmen wir an, das Modul sieht folgendermaßen aus:

export default function(who = 'world'){
    return `Hello ${who}`;
}

Nach der Zusammenstellung mit Babel und vor der Veröffentlichung:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

Also nach npm install module-namein einem anderen Projekt (keine ES2015) musste ich tun

var hello = require('module-name').default;

Um das Paket tatsächlich importieren zu lassen.

Ich hoffe, das hilft!


0

Dieses Problem ist bei der Verwendung webpackmit aufgetreten webpack-dev-middleware.

Hatte eine einzelne Datei in einen Ordner verwandelt .

Der Beobachter schien den neuen Ordner nicht zu sehen und das Modul fehlte jetzt.

Behoben durch Neustart des Prozesses.


0

Ich habe gerade ein ungewöhnliches Szenario gefunden, das für jemanden von Nutzen sein kann und eine Art roter Hering ist.

Ich habe auch den Fehler "Modul kann nicht gefunden werden" erhalten, aber seltsamerweise hat in meiner lokalen (von Mac gehosteten) Node.js-Umgebung alles perfekt funktioniert. Dieses Problem trat nur auf, wenn der Code auf unserem Linux-Server bereitgestellt wurde.

Nun ... es stellte sich als Tippfehler heraus, den (anscheinend) die Mac-basierte Node.js-Installation gerne ignorierte.

Das Include sah folgendermaßen aus:

var S3Uploader = require('./S3Uploader.class');

Die eigentliche Datei hieß jedoch "s3Uploader.class.js".

Beachten Sie den Unterschied zwischen dem Code und dem Dateinamen zwischen 's' und 'S'.

Also - in der seltsamen Möglichkeit, dass keine der anderen Lösungen hier Ihr Problem löst, überprüfen Sie dreimal, ob Sie die Zeichen in Ihrem enthaltenen Dateinamen nicht falsch schreiben! :) :)

und DUH!


1
Standardmäßig unterscheidet das osx-Dateisystem (HFS +) nicht zwischen Groß- und Kleinschreibung. Es wurde vor kurzem entdeckt und ist definitiv konfigurierbar
giulp

0

Vielleicht haben Sie wie ich "View Engine" in Express auf eine Engine gesetzt, die es nicht gibt, oder Sie haben versucht, eine nicht registrierte Template-Engine zu verwenden. Stellen Sie sicher, dass Sie Folgendes verwenden: app.engine('engine name',engine) app.set('view engine','engine name')


0

Bitte installieren Sie die neue CLI v3 (npm install -g ionic @ latest).

Wenn dieses Problem in CLI v3 immer noch ein Problem ist. Vielen Dank!


0

Wenn das Paket erfolgreich installiert wurde, wechseln Sie in den Ordner node_modules und überprüfen Sie die Datei und den Pfad. Dann importieren. Hoffe das hilft.


-3

Zunächst einmal, ja, ein Teil meiner Antwort ist definitiv hilfreich, um den von OP geposteten Fehler zu beheben. Zweitens habe ich nach dem Ausführen des folgenden Schritts einige andere Fehler festgestellt und daher auch die Lösung dieser Fehler geschrieben.

(Psst! Ich bin mir nicht sicher, ob ich bei der Lösung des oben genannten Fehlers erfolgreich geholfen habe oder ob ich gegen eine Regel oder ein Format für die Beantwortung verstoßen habe, aber ich habe den oben genannten und einige andere Fehler festgestellt und es hat viel Zeit gedauert, bis ich ihn gefunden habe die richtigen Lösungen für diese Fehler. Ich schreibe die vollständige Lösung, denn falls jemand anderes ebenfalls mit diesen Fehlern konfrontiert wird, wird er hoffentlich hier eine Lösung finden.)

Wenn Sie also die Antwort von PrashanthiDevi ergänzen und ausarbeiten und auch meine persönliche Erfahrung hinzufügen, hier ist sie:

Ich bin neu im gesamten e2e- und Unit-Test-Teil. Ich fing an, diesen Teil von Winkelmesser zu untersuchen . Jetzt hatte ich bereits die Dateien, in die Tests geschrieben wurden, aber ich musste die Tests ausführen.

Ich hatte bereits alle erforderlichen Softwareprogramme und Tools installiert, aber als ich den Code zum Ausführen der Tests zum ersten Mal ausführte, gulp itestwurde der Fehler "Modul kann nicht gefunden werden" angezeigt . Nachdem ich viele verschiedene Fragen zu SO durchgesehen hatte, fand ich eine Antwort, von der ich dachte, dass sie helfen könnte, eine Lösung zu finden.

Die Person hatte vorgeschlagen, den Befehl npm installin meinem Projektordner auszuführen .

Der Grund dafür war, den Ordner " node-modules " in unserem Projektordner mit allen erforderlichen und erforderlichen Dateien und Abhängigkeiten zu aktualisieren .

(Der folgende Teil ist für diese Frage möglicherweise irrelevant, kann aber hilfreich sein, wenn jemand auf die gleiche Situation stößt, mit der ich konfrontiert war.)

Der obige Schritt hat sicherlich meinen vorherigen Fehler behoben , aber einen neuen geworfen! Diesmal ist der Fehler Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

Die Lösung dieses Fehlers war für mich jedoch ziemlich albern (und lustig). Ich hatte die Chromedriver-Datei bereits in meinem Selen- Ordner. Es stellt sich jedoch heraus, dass der obige Fehler aufgetreten ist , weil sich meine Chromedriver- Dateien im Selenium- Ordner und nicht im Chromedriver- Ordner befanden . Das Erstellen eines Chromedriver- Ordners und das Kopieren der Chromedriver-Dateien dort löste mein Problem!

Außerdem für den Fehler: Das Warten auf den WebDriver-Server ist abgelaufen. Sie können diese Codezeile zur Datei conf.js hinzufügen exports.config{}:

seleniumAddress: 'http://localhost:8080/'

Hoffe das hilft!


-4

Ich habe die einfache Lösung, um dieses Problem zu lösen.

Entfernen Sie einfach C: \ Users \ UserName \ AppData \ Roaming \ npm \

und installieren Sie dann den Knoten.

Jetzt ist Ihr Problem gelöst.


Er benutzt Unix. Nicht Windows.
Saif Al Falah

-4

Führen Sie nur den folgenden Befehl aus:

npm install

Es werden alle erforderlichen Module im node_modulesOrdner installiert .


-5
rm -rf node_modules
npm install
npm fund

diese Arbeit für mich.


-38

Ändern Sie das Verzeichnis und zeigen Sie auf Ihren aktuellen Projektordner und dann auf "npm install". .

Dadurch werden alle Abhängigkeiten und Module in Ihrem Projektordner installiert.


2
Diese Antwort scheint nicht falsch zu sein. Ich bin der Meinung, dass die negative Abstimmung auf eine gewisse Voreingenommenheit und unterstützende sarkastische Kommentare zurückzuführen ist.
Muqsith

2
so viele Abstimmungen sind etwas zu viel. Es ist nicht ganz vage. Es bezieht sich auf die akzeptierte Antwort. Die Antwort lautet nur, dass Sie npm installim richtigen Verzeichnis arbeiten müssen. Es ist nichts Negatives daran
Shinobi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.