2015-02-16 19 views
5

Yani, Proje AB'de FileA.fs ve FileB.fs var. FileB, FileA'dan tanımları kullanır ve hem FileA hem de FileB kullanım tanımlarını Project C'den (C# ile yazılır) kullanır. Ben F # -Etkileşimli tüm dosyayı çalıştırabilir ve bu harika - hangi gerekiyordu nasıl çalışır ...F # etkileşimli - aynı derleme birden fazla dosya başvurduğunda precompiler yönergeleri nasıl kullanılır?

#if COMPILED 
namespace ProjectAB 
#else 
#I "bin\debug" 
#r "ProjectZ.dll" 
#endif 

: FileA.FS yılında

, var.

#if COMPILED 
module ProjectAB.ModuleB 
#else 
#load "FileA.fs" 
#I "bin\debug" 
#r "ProjectZ.dll" 
#endif 

Ama (FileB itibaren) bu çalıştırdığınızda, ben hata alıyorum:

FileB.fs, benim başlığıdır fsi.exe referansa göre

FileA.fs(6,1): error FS0222: Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration. 

, #load yönergesi "Bir kaynak dosyayı okur, derler ve çalıştırır". Ancak, COMPILED yönergesi tanımlanmadan yapılması gerektiği gibi görünüyor, çünkü "ProjectAB" ad alanı bildirimini göremiyor.

Başlıklarımı nasıl düzenleyebilirim ki her iki dosyayı da F # -çıkıştırıcıda çalıştırabilir miyim?

Düzenleme Aşağıdaki latkin yanıtına göre, projedeki son dosya olan _TestScript.fsx dosyası olarak bir komut dosyası oluşturdum. Ben diğer dosyalardan tüm precompiler şeyler çıkarılır ve .fsx dosyanın başlık olarak bu ayarlayın:

#if INTERACTIVE 
#I "bin\debug" 
#r "ProjectZ.dll" 
#load "FileA.fs" 
#load "FileB.fs" 
#endif 

Ben interaktif Bu çalıştırmak

, doğru erişimi için beni ProjectZ, fileA ve FileB yükler etkileşimli pencerede.

Ancak, _TestScript.fsx dosyasında, başvurulan dosyalardan ("açık" ifadeler de dahil olmak üzere) herhangi bir işlev/tür üzerinde dalgalı kırmızı çizgiler ve hiçbir intellisense alıyorum.

intellisense çalışmasını sağlamak için betik dosyasında kurmam gereken başka bir şey var mı? (Daha önce .fsx dosyalarını kullanmadığım için yanıt oldukça basit olabilir.)

+0

Genellikle tek tek dosyaları yüklemek yerine, yerleşik derlemeyi "fsx" den yapıyorum ve referans yapıyorum. Ama sadece test/keşfetme için komut dosyaları kullanıyorum, bu yüzden kilometreniz değişebilir. – scrwtp

cevap

2

Bunu sorunsuz yapmanın bir yolu olduğunu sanmıyorum. Bir kaç şey dikkate almak: Eğer fsi.exe tarafından işleme konulduğunda

  • INTERACTIVE her zaman, her neyse bir .fsx, .FS, #load 'ed olsun, tanımlanır. Fsc.exe tarafından işlenirken COMPILED benzer şekilde her zaman tanımlanır. Dokümanlardaki alıntılanmış ifadenin, bu tamamen kristal berraklığını nasıl sağlayamadığını görebiliyorum.

  • Yalnızca

Yani dosyasındaki bir ad bildirmek istiyorsanız #load 'ed dosyasından fsi boşluklarında ilan edebilir ve etkileşimli de tek bir dosya olarak çalışmaya

  • ardından ad vardır #ifdef olmak üzere. Ama bu bile ... ad ed #ifdef 'dosya #load olduğunda dışarı ed' olacağı anlamına gelir

    Sen şartlı bir modül değil, bir ad olarak ilan ederek bu geçici bir çözüm mümkün olabilir. Ya da belki ek, daha ayrıntılı tanımlamalar yaratır. Bu zor olacak.

    Derlenmiş kitaplığın bir parçası olarak düzgün çalışacak şekilde kaynak dosyaları almaya çalışmak ve aynı anda tek bir dosya komut dosyası olarak çalışmak kolay değil ve bu düşünceye göre aracın tasarlandığını düşünmüyorum. Daha yaygın olan tüm kütüphane dosyalarınızın sadece kütüphane dosyaları gibi davranması, daha sonra #load s gereksinim duydukları .fs dosyalarının atanmış bağımsız komut dosyalarını kullanmasıdır. Bu, sürüş kodunu ve kütüphane kodunu ayrı tutar ve işler daha temiz bir şekilde birbirine uyar.

  • +0

    Bu, etkileşimli pencerenin niyeti karşısında gider gibi görünüyor - mevcut dosyamdaki işlevleri test edebilmemeli, kaç dosya/DLL bağımlısı olursa olsun? Bütün projeyi tek bir dosyaya tıkamaktan başka, bu problemi ortadan kaldıracak bir dosya organizasyonu var mı? –

    +1

    "Bu sorunu çözecek bir dosya organizasyonu var mı?" - evet, dediğim gibi, kütüphane .fs dosyalarını sürücü/test .fsx dosyalarından ayrı tutun ve işler düzgün bir şekilde çalışır. Aynı kaynak dosyasında DLL kitaplığı kodunun ve testlerinin tutulması ilginç bir fikirdir, fakat bilgim için sıklıkla yapılan bir şey değil. – latkin