2014-03-19 55 views
2

我的問題是我有一個包不是存儲庫,我試圖讓它與Laravel和作曲家很好。它仍然是供應商的文件夾下的位置,唯一的問題是,如果我只是設置:作曲家,Laravel和本地包

"psr-0": { 
     "Test\\Test": "vendor/test/test/src/" 
    } 

這將加載服務提供商,但沒有一個控制器等均會自動加載。實現一個沒有自己的倉庫的幼體包的正確方法是什麼?或者這是否違背了軟件包的性質,這應該簡單地在應用程序控制器下進行構造。

該軟件包是由我使用工作臺創建的,但我發現我並不真的需要這個作爲單獨的存儲庫,但它仍然是一個很好的保存它作爲一個包。因此,結構是完全一樣的規則包:

vendor 
    testvendor 
     testpackage 
      public 
      src 
      tests 
      .gitignore 
      composer.json 
      phpunit.xml 

UPDATE:

對於時間的解決方案是我使用:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php", 
     "vendor/package" 
    ] 
}, 

如在類映射中的條目。展望未來,我可能會將此重構爲應用程序文件夾或爲此包創建存儲庫。

+0

我們需要更多的信息。這個包是什麼?這只是一堆你複製到你的供應商的文件,或者是存儲在你可以下載的服務器中的東西?它是否有作曲家包裝結構?誰創建了這個包?你可以把它作爲一個作曲家包裝並存放在家裏嗎?你能否至少向我們展示這個包的目錄結構? –

+0

爲什麼在供應商文件夾中有一個非composer包? –

+0

你會推薦將它移動到應用程序/供應商或類似的?現在我會更新這個問題,關於其他事情。 –

回答

9

如果你有一些你打電話給「包」的類,那麼你不應該把這些文件添加到你的供應商文件夾中。此文件夾由作曲家管理,並且您可能隨時將其丟失。在您的應用程序中創建一個子文件夾並將這些文件放在那裏。

您必須確定您的PSR-0自動加載將適用於文件夾結構中的每個單個文件。所以,如果你的根是vendor/test/test/src/和你的命名空間是

Test\\Test 

您的所有文件必須在

vendor/test/test/src/Test/Test/ClassFileName.php 

PSR-4是比較容易處理和理解,這

"psr-4": { 
    "Test\\Test\\": "vendor/test/test/src/" 
} 

手段您的文件必須是這樣的:

vendor/test/test/src/ClassFileName.php 

重新檢查您的名稱空間。這很容易使用與PSR-0命名空間的時候犯錯誤,記住

composer dump-autoload 

必須在每次改變的事情在composer.json或創建新的文件時運行。如果是簡單的類自動加載,每次創建文件時,如果是PSR-X自動加載,則每次創建或更新composer.json文件中的命名空間時都如此。

如果你真的是一個軟件包,你應該使用Composer:當你的軟件包被構造成一個composer軟件包(例如檢查Laravel的composer.json),將它添加到應用程序的正確方法,沒有在Packagist中列出,是通過repositories

您可以在一個公共VCS庫(非packagist)封裝:

{ 
    "require": { 
     "monolog/monolog": "dev-bugfix" 
    }, 

    "repositories": [ 
     { 
      "type": "vcs", 
      "url": "https://github.com/igorw/monolog" 
     } 
    ] 
} 

你可以有(非packagist)在包一個由密碼VCS庫保護(GIT,到位桶...) :

{ 
    "require": { 
     "vendor/my-private-repo": "dev-master" 
    }, 
    "repositories": [ 
     { 
      "type": "vcs", 
      "url": "[email protected]:vendor/my-private-repo.git" 
     } 
    ] 
} 

,你可以在你的硬盤拉上你的包,並通過artifact庫類型加載它們:

"repositories": [ 
    { 
     "type": "artifact", 
     "url": "path/to/directory/with/zips/" 
    } 
], 
+0

謝謝你的詳細回覆。我閱讀了文檔,問題在於它不是存儲庫。我目前的解決方案是添加供應商/ odeon到班級地圖,現在一切正常。我不是100%,這是解決我的問題一切正常運作的正確方法。 –

+0

如果您爲同一個軟件包混合使用多種自動加載方法,則不太理想。但是,如果你現在只是使用classmaps,是的,它會工作,只是你可能每次創建一個新類時都必須執行'composer dump-autoload'。 –

+0

我會暫時保持這種狀態,但是通過評論我應該重構這個到應用程序文件夾或使這個軟件包成爲一個存儲庫。我會接受這個解決方案,因爲它解釋了什麼是「正確的方式」。 –

1

雖然@Antonio卡洛斯·裏貝羅的答案是非常好的,我有問題,安裝定製的軟件包本地

假設這個(這是他的回答的最後部分還稱)是我們想要的包目錄結構安裝:

D:/test_pack 
    src/ 
    composer.json 

如果您不希望您的自定義程序包(最有可能你開發,你自己)上傳到在線儲存庫,你可以使用以下兩種方法之一:

方法I

(你必須爲你的包指定版本,否則你會得到這個錯誤:請求的包不能在任何版本中找到,有可能是在包裝的名稱拼寫錯誤。)

1)在composer.json中,將版本添加到您的包中。你的包的JSON應該是這個樣子:

{ 
"name": "gandalf/test_pack",//This is your package's name 
"description": "some desc", 
"version": "1.0.0",//This is the version that you have to specify 
"authors": [ 
    { 
     "name": "gandalf the grey", 
     "email": "[email protected]" 
    } 
], 
"minimum-stability": "dev", 
"require": { 
    "laravel/framework": "~5.4" 
}, 
"autoload": { 
    "psr-4": { 
     "Gandalf\\BotPack\\": "src/" 
    } 
} } 

2)壓縮您的包(假設壓縮文件是在d:/test_pack/test_packa.zip)

3)在laravel的composer.json加你的包名稱(在我們的例子中,gandalf/test_pack需要json的一部分),並將庫數組添加到composer.json文件,並在該數組中指定包的zip文件所在的目錄(在我們的例子中爲D:/ test_pack) 。這樣

{ 
    ..., 
    "require": {//adding our package name to laravel's composer.json 
     ..., 
     "gandalf/test_pack": "*"//package's name 
    }, 
    ..., 

    "repositories": [ 
     { 
      "type": "artifact", 
      "url": "D:/test_pack" 
     } 
    ] 
} 

方法II(我最喜歡的方法,你必須初始化爲git的本地倉庫使用git init然後git add .git commit -m "your message"你的包目錄)

1)初始化爲git的目錄包目錄並將所有更改提交到本地存儲庫

(假設D:/test_pack是包含您的包的目錄(src/目錄和composer.json) )

轉到D:/test_pack目錄並運行這些命令

git init 
git add . 
git commit -m "your message for this commit" 

2)在你的包composer.json文件添加最低穩定性

{ 
     "name": "gandalf/test_pack", 
     "description": "some desc", 
     "authors": [ 
      { 
       "name": "gandalf the grey", 
       "email": "[email protected]" 
      } 
     ], 
     "minimum-stability": "dev",//setting minimum-stability 
     "require": { 
       //dependencies that your package needs 
     }, 
     "autoload": { 
      "psr-4": { 
       "Gandalf\\BotPack\\": "src/" 
      } 
     } 
    } 

3)在laravel的作曲家。json文件需要你的包的「dev-master」

{ 
    ..., 
    "require": { 
     ...,//some dependencies that laravel needs 
     "gandalf/test_pack": "dev-master"//requiring dev-master from repository 
    }, 

    "repositories": [ 
     { 
      "type": "git", 
      "url": "D:/test_pack"//path of the local repository directory which contains your package 
     } 
    ] 
}