2013-08-22 244 views
32

的絕對基本路徑到現在爲止,我們可以得到一個文件的絕對路徑,打開之後爲readStream這個代碼片段:查找項目目錄

var base = path.resolve('.'); 
var file = base + '/data/test.csv'; 

fs.createReadStream(file) 

由於流星0.6.5的基本路徑指向.meteor/local/build/programs/...

還有Assets API,但不能給我們一個路徑,但只能讀取文檔。我們需要一個流來處理一些更大的數據文件?

+0

Loomi你好,可以請你澄清你的問題有點 - 什麼是新的基本路徑造成的問題? –

+0

@ stephan-tual嗨Stephan,由於Meteor的變化,如果我正確理解這一點,那麼在運行之前將文件複製到構建目錄。這意味着沒有可能通過nodejs內部手動訪問文件。我正在尋找一種方法來引用穩定的項目目錄內的文件。如果我正確地看到這一點,資產API就是這樣做的。但它直接傳遞文件。另一方面,我只需要返回我可以打開文件格式的路徑,例如/private/something.csv比fs.createReadStream。 – loomi

+0

嗨Loomi,你有看看這個包:https://atmosphere.meteor.com/package/fs? –

回答

5

由於1.3版本中,documented功能

Assets.absoluteFilePath(assetPath)

似乎是拿到項目路徑可靠的最佳途徑。

Meteor Github

+0

什麼是'assetPath'?即使我沒有任何資產,我也可以使用它嗎? –

+0

該函數返回資產的路徑。這是最後的簡潔版本,用於查找您喜歡在Meteor應用程序中使用的文件的路徑。如果您需要絕對路徑而不需要解決資產問題,我想您會創建一個虛擬資產並剝離非必要部分。 – loomi

+0

好吧,這很好,但最初的問題是關於項目基礎路徑,而不是資產路徑。所以實際上這個答案是錯誤的。這不應該被接受的答案。 –

16

當我更新到0.6.5時,我遇到了同樣的困境。

什麼我目前做的是讓這樣的路徑:

/my/application/build/app/programs 

/my/application/.meteor/local/build/programs 
的捆綁模式

var meteor_root = Npm.require('fs').realpathSync(process.cwd() + '/../'); 

這對開發模式返回

So fr OM在這裏我得到我的應用程序的「根」的路徑,像這樣:

var application_root = Npm.require('fs').realpathSync(meteor_root + '/../'); 

// if running on dev mode 
if(Npm.require('path').basename(Npm.require('fs').realpathSync(meteor_root + '/../../../')) == '.meteor'){ 
    application_root = Npm.require('fs').realpathSync(meteor_root + '/../../../../'); 
} 

在此會失敗的唯一情況是,如果你碰巧命名您的應用程序文件夾「.meteor」但是這是一個邊緣的情況下。

相對於那個你可以訪問任何你需要的東西。

此外,您還可以得到直接進入到資產文件夾,該流星捆綁創建:

var assets_folder = meteor_root + '/server/assets/' + Npm.require('path').basename(application_root); 

,我期望能夠最終加入更好的文件/路徑交互API這很可能是暫時的。 。

希望幫助

+0

不錯的解決方案,但絕對是框架未來需要處理的事情。我們在這裏的同一頁嗎? – loomi

+0

@loomi是的,絕對。我認爲他們需要比「獲取文件內容」API更好的使它成爲更可用的框架。好消息是始終存在合理的解決方法;) – SuitedSloth

55

的另一種方式,現在找到你的項目的根目錄是這樣的:

var base = process.env.PWD 

請注意,這與process.cwd()不一樣。相反,它是運行meteor命令的目錄,這通常是您要查找的內容。還請注意,從部署的捆綁包運行應用程序時,這可能不會很有幫助。

+0

這聽起來很完美,因爲這是什麼時候工作的? – loomi

+0

我不知道。我只是在當前版本中自己發現了這一點。 –

+4

它不是節點應用程序根路徑。只有目錄路徑,並取決於你在哪裏執行此代碼。 – anshuman

4

流星0.8.3,

__meteor_bootstrap__.serverDir給出的工作目錄,在服務器模式下運行。

例如

if (Meteor.isServer) { 
    console.log(__meteor_bootstrap__.serverDir); 
} 
+3

Meteor 1.0它說'__meteor_bootstrap__未定義 – krivar

+0

從Windows上的Meteor 1.2.1開始'__meteor_bootstrap__'被定義並等於'path.resolve('。')'和'process.cwd()'。 – Konard

6

嘿,你不需要硬編碼像上面的答案...看看到This package

安裝它後,你可以訪問您的流星的根路徑只是王氏Meteor.rootPath

+1

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –

+1

它不是一個鏈接唯一的答案,我告訴他如何使用該包訪問root.path ... – SsouLlesS

+0

從Meteor 1.2.1起在Windows上不起作用:https://github.com/VeliovGroup/Meteor-root /問題/ 3。 – Konard

1

由於流星1.2.1,這個工作對我來說:

var absoluteBasePath = path.resolve('../../../../../.'); 

了相同的結果使用split

var absoluteBasePath = path.resolve('.').split(path.sep + '.meteor')[0]; 

使用process.cwd()

var absoluteBasePath = path.resolve(process.cwd(), '../../../../../'); 
var absoluteBasePath = path.resolve(process.cwd()).split(path.sep + '.meteor')[0]; 
+0

然後從Meteor 1.2.1x開始,如果它們改變了慣例,它可能會再次崩潰。使用該系統更安全。 – dudewad

+0

是的,當然。你打算怎麼做這樣的系統?你能提供替代解決方案嗎? – Konard

+0

除非你的用例不太常見,否則我會認爲process.env.PWD的接受答案應該是訣竅。但是,如果你從一個不同於你的基本目錄的目錄中運行流星(如果這甚至是任何人甚至會做的),那麼你可能必須更加奇特。 – dudewad